2016年7月16日 星期六

宣告變數 (JavaScript 4)

宣告變數有3個關鍵字
var:全域變數
const:唯讀的,和java的final不太一樣,java的可以給一次,有值就不能改了;const都不能改
let:區域變數
※不寫以上三個也是全域變數,但有點不太一樣,下面有例子


※var和不寫var一樣的情況

bla = 2;
console.log(bla); // 2
var bla;
console.log(bla); // 2


※var和不寫var不一樣的情況1

var a = 1;
console.log('a=' + a); // 1
delete this.a;
console.log('a=' + a); // 1
    
b = 2;
console.log('b=' + b); // 2
delete this.b;
console.log('b=' + b); // 找不到b

※const和let的結果和寫var一樣,delete沒有作用

※不寫this也是一樣的結果


※var和不寫var不一樣的情況2

var xxx = "global";
var test = function () {
    console.log(xxx); // 這行會因為下行而有變化
    var xxx = "local"; // 有沒有加var有差
    console.log(xxx);
}
console.log(xxx);
    
var test2 = function () {
    console.log(xxx);
}
----------
<button onclick="test()">t1</button>
<button onclick="test2()">t2</button>

※此例test()和test2原本都是global,但test裡也宣告了xxx變數,所以test第一次呼叫時會變成undefined

※沒寫var會變成全域變數,第3行是global,這個和大部分的人想的一樣


※var變成區域變數

var x = 0;
function f(){
    // var z = y = x = 1; // z未定義
    var x = y = z = 1; // x是區域,y是全域
    console.log(x, y, z); // 1 1 1
}
f();
console.log(x, y, z); // 0 1 1

※宣告多個變數為一行時,最左邊的在全域變數找的到才不會出錯


※let和var的差異

var a = 1;
var b = 2;
    
if (a === 1) {
    var a = 11; // 區域變數a,如果全域也有變數a,不管有沒有加var,都會覆蓋
    let b = 22; // 區域變數b,只活在if裡
    
    console.log(a);  // 11
    console.log(b);  // 22
}
console.log(a); // 11
console.log(b); // 2


※const 須注意

const c = {"key": "value"};
console.log(c.key); // value
c.key = 'v';
console.log(c.key); // v
c = {'c':'ccc'}; // 錯誤

※如果宣告成JSON的格式,值還是可以改的;但key不行


※取值須注意

var a = { b: {a: "ooo", "b": "xxx"}, 7: "zzz" };
console.log(a.b.b); // xxx
console.log(a.b['b']); // xxx
console.log(a["b"].b); // xxx
console.log(a["b"]['b']); // xxx
console.log(a[7]); // zzz
// console.log(a.7); // 語法錯誤,數字不要點
    
var t = {
    "": "empty",
    "!": "exclamation"
}
// console.log(t.""); // 不可預期的錯誤
console.log(t[""]); // empty
// console.log(t.!); // 不可預期的錯誤
console.log(t["!"]); // exclamation

※上半部沒什麼問題,下半部要注意key為空和一些特殊符號的情形

沒有留言:

張貼留言