资讯专栏INFORMATION COLUMN

JavaScript 关于ES6 const 深入理解

hzc / 2156人阅读

摘要:不可变的只是这个地址,即不能把指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。在扩展一次,如果是一个多层对象可以如下所写可以彻底锁死多维对象。。。。

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

关于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]);
        }
    })
}

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

填坑完毕.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109565.html

相关文章

  • 深入理解ES6》笔记——Symbol和Symbol属性(6)

    摘要:设置对象属性只读。提供了一个注册机制,当你注册之后,就能在全局共享注册表里面的。的注册表和对象表很像,都是结构,只不过这个是值。语法只有一个参数,返回的是从注册表获取全局共享的注意如果要防止命名重复问题,可以加上前缀。 还记得对象Object吗? let obj = { a: 1 } 对象的格式: Object { key: value } 在ES5的时代,对象的key只能...

    heartFollower 评论0 收藏0
  • 深入理解ES6》笔记——块级作用域绑定(1)

    摘要:没有声明的情况和都能够声明块级作用域,用法和是类似的,的特点是不会变量提升,而是被锁在当前块中。声明常量,一旦声明,不可更改,而且常量必须初始化赋值。临时死区的意思是在当前作用域的块内,在声明变量前的区域叫做临时死区。 本章涉及3个知识点,var、let、const,现在让我们了解3个关键字的特性和使用方法。 var JavaScript中,我们通常说的作用域是函数作用域,使用var声...

    2bdenny 评论0 收藏0
  • ES6-7

    摘要:的翻译文档由的维护很多人说,阮老师已经有一本关于的书了入门,觉得看看这本书就足够了。前端的异步解决方案之和异步编程模式在前端开发过程中,显得越来越重要。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。 JavaScript Promise 迷你书(中文版) 超详细介绍promise的gitbook,看完再不会promise...... 本书的目的是以目前还在制定中的ECMASc...

    mudiyouyou 评论0 收藏0

发表评论

0条评论

hzc

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<