var與let、const的區別
在最新的 ES6 中,新添加了兩個用於變量聲明的關鍵字 let 和 const
一、var聲明的變量會掛載在window上,而let和const聲明的變量不會:
var a = 'a'; console.log(a,window.a) //abc abc let b = 'b'; console.log(b,window.b) //b undefined const c = 123; console.log(c,window.c) //123 undefined
二、var聲明變量存在變量提升,let和const不存在變量提升
1 console.log(a); // undefined ==> a已聲明還沒賦值【var a】,默認得到undefined值 2 var a = 100;
1 console.log(b); // Uncaught ReferenceError: b is not defined ==> 報錯:找不到b這個變量 2 let b = 10;
1 console.log(c); // Uncaught ReferenceError: b is not defined ==> 報錯:找不到b這個變量 2 const c = 10;
三、let和const聲明形成塊作用域
1 { 2 var a = 100; 3 let b = 10; 4 } 5 console.log(a); // 100 6 console.log(b) // 報錯:b is not defined ===> 找不到b這個變量
1 if(true){ 2 var a = 100; 3 const c = 1; 4 } 5 console.log(a); // 100 6 console.log(c) // 報錯:c is not defined ===> 找不到c這個變量
四、同一作用域下let和const不能聲明同名變量,而var可以
1 var a = 100; 2 console.log(a); // 100 3 4 var a = 10; 5 console.log(a); // 10
1 let a = 100; 2 let a = 10; // 控制台報錯:Identifier 'a' has already been declared ===> 標識符a已經被聲明了。
五、暫存死區
1 var a = 100; 2 if(1){ 3 a = 10; 4 //在當前塊作用域中存在a使用let/const聲明的情況下,給a賦值10時,只會在當前作用域找變量a, 5 // 而這時,還未到聲明時候,所以控制台Error:a is not defined 6 let a = 1; 7 }
六、const
1 /* 2 * 1、一旦聲明必須賦值,不能使用null占位。 3 * 2、聲明后不能再修改 4 * 3、如果聲明的是復合類型數據,可以修改其屬性 5 * */ 6 7 const a = 'abc'; 8 9 const list = []; 10 list[2] = 'abc'; 11 console.log(list); // [empty × 2, "abc"] 12 13 const obj = {a:100}; 14 obj.a = 'abc'; 15 console.log(obj); // {a:'abc'}
