摘要:不可变的只是这个地址,即不能把指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。在扩展一次,如果是一个多层对象可以如下所写可以彻底锁死多维对象。。。。
前端面试大坑千千万,填完一个是一个
关于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
摘要:设置对象属性只读。提供了一个注册机制,当你注册之后,就能在全局共享注册表里面的。的注册表和对象表很像,都是结构,只不过这个是值。语法只有一个参数,返回的是从注册表获取全局共享的注意如果要防止命名重复问题,可以加上前缀。 还记得对象Object吗? let obj = { a: 1 } 对象的格式: Object { key: value } 在ES5的时代,对象的key只能...
摘要:没有声明的情况和都能够声明块级作用域,用法和是类似的,的特点是不会变量提升,而是被锁在当前块中。声明常量,一旦声明,不可更改,而且常量必须初始化赋值。临时死区的意思是在当前作用域的块内,在声明变量前的区域叫做临时死区。 本章涉及3个知识点,var、let、const,现在让我们了解3个关键字的特性和使用方法。 var JavaScript中,我们通常说的作用域是函数作用域,使用var声...
摘要:的翻译文档由的维护很多人说,阮老师已经有一本关于的书了入门,觉得看看这本书就足够了。前端的异步解决方案之和异步编程模式在前端开发过程中,显得越来越重要。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。 JavaScript Promise 迷你书(中文版) 超详细介绍promise的gitbook,看完再不会promise...... 本书的目的是以目前还在制定中的ECMASc...
阅读 1024·2023-04-25 14:35
阅读 2798·2021-11-16 11:45
阅读 3379·2021-09-04 16:48
阅读 2146·2021-08-10 09:43
阅读 461·2019-08-30 13:17
阅读 1588·2019-08-29 13:27
阅读 833·2019-08-26 13:58
阅读 2118·2019-08-26 13:48