let與const的區別
阿新 • • 發佈:2017-10-25
blog log ons 內部 reac cnblogs == 聲明 freeze
let與const都是只在聲明所在的塊級作用域內有效。
let聲明的變量可以改變,值和類型都可以改變,沒有限制。
const
聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以後賦值。
const a ;//報錯,一旦聲明變量,應該立即賦值!! const b = 2; b = 3//報錯,因為定義常量之後不能成重新賦值!!
對於復合類型的變量,如數組和對象,變量名不指向數據,而是指向數據所在的地址。const
命令只是保證變量名指向的地址不變,並不保證該地址的數據不變,所以將一個對象聲明為常量必須非常小心。
const names = []; names = [1,2,3] //出錯,因為變量names指向的地址不能發生改變,應始終指向[]所在的地址!!![1,2,3]與[]不是同一個地址
//不會報錯,因為names指向的地址不變,改變的只是內部數據 const names = []; names[0] = 1 names[1] = 2 names[2] = 3
如果想讓定義的對象或數組的內部數據也不能夠修改和改變,可以使用object.freeze(names)進行凍結,這樣為對象添加新屬性就不起作用。
除了將對象本身凍結,對象的屬性也應該凍結。下面是一個將對象徹底凍結的函數
var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key)=> { if ( typeof obj[key] === ‘object‘ ) { constantize( obj[key] ); } }); };
let與const的區別