let與const都是只在聲明所在的塊級作用域內(nèi)有效。
let聲明的變量可以改變醋界,值和類型都可以改變叉瘩,沒有限制膳帕。
const聲明的變量不得改變值,這意味著,const一旦聲明變量危彩,就必須立即初始化攒磨,不能留到以后賦值。
consta ;//報(bào)錯(cuò),一旦聲明變量汤徽,應(yīng)該立即賦值C溏帧!
const b = 2;
b = 3//報(bào)錯(cuò)谒府,因?yàn)槎x常量之后不能成重新賦值F纯病!
對于復(fù)合類型的變量完疫,如數(shù)組和對象泰鸡,變量名不指向數(shù)據(jù),而是指向數(shù)據(jù)所在的地址壳鹤。const命令只是保證變量名指向的地址不變盛龄,并不保證該地址的數(shù)據(jù)不變,所以將一個(gè)對象聲明為常量必須非常小心芳誓。
constnames = [];
names = [1,2,3] //出錯(cuò)余舶,因?yàn)樽兞縩ames指向的地址不能發(fā)生改變,應(yīng)始終指向[]所在的地址G绿省D渲怠![1,2,3]與[]不是同一個(gè)地址
//不會(huì)報(bào)錯(cuò)赂摆,因?yàn)閚ames指向的地址不變挟憔,改變的只是內(nèi)部數(shù)據(jù)
constnames =[];
names[0] =1names[1] = 2names[2] = 3
如果想讓定義的對象或數(shù)組的內(nèi)部數(shù)據(jù)也不能夠修改和改變,可以使用object.freeze(names)進(jìn)行凍結(jié)库正,這樣為對象添加新屬性就不起作用曲楚。
除了將對象本身凍結(jié),對象的屬性也應(yīng)該凍結(jié)褥符。下面是一個(gè)將對象徹底凍結(jié)的函數(shù)
varconstantize = (obj) =>{
Object.freeze(obj);
Object.keys(obj).forEach( (key)=>{if(typeofobj[key] ==='object') {
constantize( obj[key] );
}
});
};