摘要:最近在使用想到一个问题,里常用的一种语法是这样的通过解构赋值保留了里未修改的部分,并覆盖修改的部分,那么现在问题来了,这里的新对象通过解构得来的,是否是原来属性的引用赋值呢我们知道,如下情况这里是的一个引用赋值。比如上例中希望可以帮助大家。
最近在使用Redux想到一个问题,Redux里常用的一种语法是这样的:
setSth(state, { payload }) { const { newthing} = payload; return { ...state, newthing } }
Redux通过解构赋值...state,保留了state里未修改的部分,并覆盖修改的部分,那么现在问题来了,这里的新对象通过解构得来的...state,是否是原来属性的引用赋值呢?
我们知道,如下情况:
let state = {a: 1, b: 2} let state2 = state; state2.a = 5; // state.a === 5 => true
这里state2是state的一个引用赋值。
那么使用解构赋值生成一个新对象会如何呢?
let state = {a: 1, b: 2} let state2 = { ...state } state2.a = 5; // state.a === 1 => true
通过实验可见,state2属性的修改并没有影响到state,所以这是一份拷贝,那么问题又来了,这个拷贝是只有一层的浅拷贝,还是递归进去的深拷贝呢,我直觉地认为是深拷贝,于是又做了一个实验:
let state = {a: {a1: 1, a2: 2}, b: 2} let state2 = { ...state } state2.a.a1 = 5; // state.a.a1 === 5 => true
事实证明我的直觉错了,解构复制到全新对象里只是浅拷贝,对象里属性的属性还是对原来对象里属性的属性的一个引用,因为解构赋值可以生成一份浅拷贝,其实我们针对已知结构的对象也可以全部使用这个方法实现自己想要的拷贝。比如上例中:
let state = {a: {a1: 1, a2: 2}, b: 2} let state2 = { ...state, a: { ...state.a } }
希望可以帮助大家。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/103650.html
摘要:变量的解构赋值结构赋值允许使用默认值内部使用严格相等运算符,判断一个位置是否有值。所以,只有当一个数组成员严格等于,默认值才会生效。这样的层层判断非常麻烦,因此现在有一个提案,引入了传导运算符,简化上面的写法。 变量的解构赋值 结构赋值允许使用默认值 let [foo = true] = []; foo // true ES6 内部使用严格相等运算符(===),判断一个位置是否...
摘要:基本原理解构是提供的语法糖,其实内在是针对可迭代对象的接口,通过遍历器按顺序获取对应的值进行赋值。属性值返回一个对象的无参函数,被返回对象符合迭代器协议。迭代器协议定义了标准的方式来产生一个有限或无限序列值。 更多系列文章请看 1、基本语法 1.1、数组 // 基础类型解构 let [a, b, c] = [1, 2, 3] console.log(a, b, c) // 1, 2, ...
阅读 3091·2023-04-25 15:44
阅读 1875·2019-08-30 13:11
阅读 2829·2019-08-30 11:11
阅读 3003·2019-08-29 17:21
阅读 1305·2019-08-29 15:38
阅读 897·2019-08-29 12:49
阅读 1792·2019-08-28 18:19
阅读 3221·2019-08-26 14:01