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