JavaScript 关于ES6 const 深入理解

前端面试大坑千千万,填完一个是一个

关于ES6 const用法

众所周知,const声明之后的变量不可以修改,比如:

const name = 'lijk';
name = 'lijks'  //linshi.html:15 Uncaught SyntaxError: Identifier 'name' has already been declared

但是今天面试官提出了,如果const 一个object对象的话,是否可以修改属性值,懵逼中...

被怼回来之后回家键入了:

const objs = {name:'lijk'}
objs.name = 'lijks'

没有报错??????? 什么情况?经过一顿查询之后得知

上面代码中,常量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]);
        }
    })
}

可以彻底锁死多维对象。。。。

填坑完毕.

原文链接:segmentfault.com

上一篇:心灵沉淀 第四天
下一篇:单页应用的部署方案

相关推荐

官方社区

扫码加入 JavaScript 社区