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為空和一些特殊符號的情形
沒有留言:
張貼留言