var的變數提升 const命令的用法 const聲明的是一個只讀的常量,一旦聲明,就不可改變. const聲明的常量只在塊級有效 const聲明的常量不存在變數的提升 const不可重覆聲明常量 const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址不得改動。對於簡單類型的數據 ...
var的變數提升
console.log(a); //輸出undefined var a=10; 他的實際執行順序是: var a; console.log(a); a=10 這就是var的變數提升
const命令的用法
const聲明的是一個只讀的常量,一旦聲明,就不可改變.
const a=3.14 //聲明的常量a不可更改
//a=123 因為它聲明的常量不可更改,所以這句會報錯 // TypeError: Assignment to constant variable.
console.log(a)
const聲明的常量只在塊級有效
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
只能保證這個指針是固定的,至於它指向的數據結構是不是可變的,就完全不能控制了。
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命令的用法
let是
JavaScript 新增了塊級作用域。跟const一樣,只對塊級有效
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