具有与以下功能相同的效果:
const obj = {a:'a', b:'b', c:'c'};
const {a, b} = obj;
const result = {a, b};
或者,在ES5中:
const obj = {a:'a', b:'b', c:'c'};
const result = Object.keys(obj)
.filter((key) => ['a', 'b', 'c'].includes(key))
.reduce((acc, key) => acc[key] = obj[key], {})
我想
const result = { a, b } = obj;
可以工作,但是显然,它具有以下效果:
const result = obj;
,因为result
具有obj的所有属性,并且似乎也指向它(result.a = 'changed'
导致obj.a === changed
为真)。这是一个错误吗?
答案 0 :(得分:0)
const result = {...obj}
那行得通吗?这不是深度复制,但您的第一个示例也不是。
答案 1 :(得分:0)
要克隆Object
,使其指向不同的内存位置,即对其中一个克隆所做的更改不会影响另一个,则可以使用:
1- Object.assign()
:
const result = Object.assign({}, obj);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
2.-传播算子(在ES6中):
const result = {...obj};
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
答案 2 :(得分:0)
您可以排线
const result = { a, b } = obj;
正如其他人所说,以看起来像您打算的方式工作,它使用obj的深层副本而不是引用obj本身。一种执行此操作的方法可能是您正在寻找的“快速衬板”
const result = (({ a, b }) => ({ a, b }))(JSON.parse(JSON.stringify(obj)));
JSON.parse(JSON.stringify(obj))
仅提供obj
的深层副本。因此,result
的更改不会影响obj
,反之亦然。
const obj = {a:'a', b:'b', c:'c'};
const result = (({ a, b }) => ({ a, b }))(JSON.parse(JSON.stringify(obj)));
console.log(result);//expected output: Object { a: "a", b: "b" }
result.a = 'changed';
console.log(result);//expected output: Object { a: "changed", b: "b" }
console.log(obj);//expected output: Object { a: "a", b: "b", c: "c" }
这种深层复制方法的一些性能信息在this SO answer中共享,并且该线程有一些替代方法。
对象解构语法的语法说明可以在this SO answer中找到。