前端面試大坑千千萬,填完一個是一個html
關於ES6 const用法前端
衆所周知,const聲明以後的變量不能夠修改,好比:面試
const name = 'lijk'; name = 'lijks' //linshi.html:15 Uncaught SyntaxError: Identifier 'name' has already been declared
可是今天面試官提出了,若是const 一個object對象的話,是否能夠修改屬性值,懵逼中...指針
被懟回來以後回家鍵入了:code
const objs = {name:'lijk'} objs.name = 'lijks'
沒有報錯???????
什麼狀況?通過一頓查詢以後得知htm
上面代碼中,常量objs 儲存的是一個地址,這個地址指向一個對象。不可變的只是這個地址,即不能把objs 指向另外一個地址,但對象自己是可變的,因此依然能夠爲其添加新屬性。對象
若是以下編寫原型鏈
const objs = {name:'lijk'} objs= {name:'lijks'}
恭喜你,你要的錯誤來了,正應瞭如上所述,const的obj是指向Object一個指針(這塊能夠去看原型鏈部分),對象自己是能夠修改的,可是指針不能。原型
PS:我是個有脾氣的人,我若是十分想凍結這個對象呢?ES6爲咱們提供了一個新方法變量
const objs = Object.freeze({name:'lijk'}) objs.name = 'lijks'
如上所示,在非嚴格狀況下第二行代碼是無效的
在嚴格模式(use strict)下,第二行部分會報錯。
在擴展一次,若是object是一個多層對象???
能夠以下所寫:
const freezeObjs = (obj) =>{ Object.freeze(obj); Object.keys(obj).forEach((key,i) => { if(typeOf obj[key] === 'object'){ freezeObjs(obj[key]); } }) }
能夠完全鎖死多維對象。。。。
填坑完畢.