【发布时间】:2020-02-03 18:58:51
【问题描述】:
Object.assign(...as) 似乎更改了输入参数。示例:
const as = [{a:1}, {b:2}, {c:3}];
const aObj = Object.assign(...as);
我将一个对象字面量数组解构为 assign 函数的参数。
我省略了console.log 语句。这是节点 13.7 的标准输出:
和之前一样赋值:[ { a: 1 }, { b: 2 }, { c: 3 } ]
aObj: { a: 1, b: 2, c: 3 }
分配后:[ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]
读者可能会注意到as 的第一个元素已整体更改。
将新数组 bs 元素更改为不可变对象(使用 freeze)
const bs = [{a:1}, {b:2}, {c:3}];
[0, 1, 2].map(k => Object.freeze(bs[k]));
const bObj = Object.assign(...bs);
导致错误:
TypeError: 无法添加属性 b,对象不可扩展 在 Function.assign ()
这表明参数确实正在改变。
真正让我感到困惑的是,即使将我的数组 cs 绑定到一个函数中(我认为你在 JS 中称之为闭包)
const cs = [{a:1}, {b:2}, {c:3}];
const f = (xs) => Object.assign(...xs);
const g = () => f(cs);
const cObj = g();
返回:
cs 分配前:[ { a: 1 }, { b: 2 }, { c: 3 } ] cObj: { a: 1, b: 2, c: 3 } 赋值后的cs:[ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]
这里出了什么问题?以及如何安全地使用Object.assign 而不会破坏它的第一个参数?
【问题讨论】:
-
你应该使用
Object.assign({}, ...as),因为它修改了第一个参数。
标签: javascript