console.log(a); //輸出undefined var a=10; 他的實際執行順序是: var a; console.log(a); a=10 這就是var的變量提高
const聲明的是一個只讀的常量,一旦聲明,就不可改變.javascript
const a=3.14 //聲明的常量a不可更改 //a=123 由於它聲明的常量不可更改,因此這句會報錯 // TypeError: Assignment to constant variable.
console.log(a)
const聲明的常量只在塊級有效java
if(true){ const who="wxp" } console.log(who) //who is not defined
const聲明的常量不存在變量的提高數組
console.log(a);//a is not defined const a=3.14
const不可重複聲明常量數據結構
var msg="hello"; const msg="world" //Identifier 'msg' has already been declared
const
實際上保證的,並非變量的值不得改動,而是變量指向的那個內存地址不得改動。對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,所以等同於常量。但對於複合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指針,const
只能保證這個指針是固定的,至於它指向的數據結構是否是可變的,就徹底不能控制了。spa
const arr=[] //聲明的數組保存的是指針,因此沒法保證它裏面的值是固定的。 const obj={} //跟數組同樣都是 可變數據類型 arr.push(123) obj.name="wxp" console.log(arr) //[123] console.log(obj) //{name:"wxp"}
若是真的想將對象凍結,應該使用Object.freeze
方法。指針
const foo=Object.freeze({}); //foo指向的是一個凍結對象,因此沒法對它添加新的屬性。 foo.age=22 //不生效,由於foo是一個凍結對象。嚴格模式時還會報錯 console.log(foo) //{}
let是
JavaScript 新增了塊級做用域。跟const同樣,只對塊級有效code
let a=10 if(true){ let a=5 console.log(a) //5 } console.log(a) //10
let跟const同樣不可重複聲明對象
var a=10 let a=20 //Identifier 'a' has already been declared