JavaScript 關於ES6 const 深刻理解

前端面試大坑千千萬,填完一個是一個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]);
        }
    })
}

能夠完全鎖死多維對象。。。。

填坑完畢.

相關文章
相關標籤/搜索