理解es6中的const與“不變”
阿新 • • 發佈:2018-06-03
凍結 布爾 內存 test arr foo 理解 pro IV 關於
const
實際上保證的,並不是變量的值不得改動,而是變量指向的那個內存地址不得改動。
效果
- 對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同於常量。
- 對於復合類型的數據(主要是對象和數組),變量指向的內存地址,
const
只能保證這個指針是固定的,不能保證它指向的數據結構是不可變得
'use strict'
const obj = {}
const arr = []
obj.prop = 123 // 不改動指針
arr.push('Hello') // 只改變數據結構
try{
obj = {} // obj重指向新對象
} catch (err) {
console.log(err.message) // 失敗
}
try{
arr = []
} catch (err) {
console.log(err.message) // 失敗
}
徹底凍結
除了將對象本身凍結,對象的屬性也應該凍結
關於Object.freeze
方法可以凍結一個對象。凍結對象是指那些不能添加新的屬性,不能修改已有屬性的值,不能刪除已有屬性,以及不能修改已有屬性的可枚舉性、可配置性、可寫性的對象。
'use strict'
const foo = {}
foo.prop = 1
foo.config = {
prop:1
}
const freeze = obj => {
Object.freeze(obj)
Object.keys(obj).forEach( key=>{
if(typeof obj[key] === 'object') {
freeze(obj[key])
}
})
}
freeze(foo) // 完全凍結
try {
foo.prop = 'test'
} catch (err) {
console.log(err.message )
}
歡迎技術交流,引用請註明出處。
個人網站:哥有內涵.com
Github:godbmw
理解es6中的const與“不變”