Object.assign(...as)
似乎改变了输入参数。例子:
const as = [{a:1}, {b:2}, {c:3}];
const aObj = Object.assign(...as);
我解构一个对象文字数组作为分配函数的参数。
我省略了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);
导致错误:
类型错误:无法添加属性 b,对象不可扩展
at 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();
returns:
赋值前的 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
而不破坏它的第一个论点?