1. 程式人生 > >理解es6中的const與“不變”

理解es6中的const與“不變”

凍結 布爾 內存 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與“不變”