gpt4 book ai didi

javascript - Object.assign(...as) 更改输入参数

转载 作者:行者123 更新时间:2023-12-02 18:48:58 25 4
gpt4 key购买 nike

Object.assign(...as) 似乎更改了输入参数。示例:

const as = [{a:1}, {b:2}, {c:3}];
const aObj = Object.assign(...as);

我解构一个对象文字数组作为分配函数的参数。我省略了 console.log 语句。这是节点 13.7 的标准输出:

as before assign: [ { a: 1 }, { b: 2 }, { c: 3 } ]

aObj: { a: 1, b: 2, c: 3 }

as after assign: [ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]

读者可能会注意到as第一个元素已被整体更改。将新数组 bs 元素更改为不可变对象(immutable对象)(使用 freeze)

const bs = [{a:1}, {b:2}, {c:3}];
[0, 1, 2].map(k => Object.freeze(bs[k]));
const bObj = Object.assign(...bs);

导致错误:

TypeError: Cannot add property b, object is not extensibleat Function.assign (<anonymous>)

这表明参数确实正在改变。

真正让我困惑的是,甚至通过将我的数组 cs 柯里化(Currying)为一个函数来绑定(bind)它(我认为你在 JS 中称其为闭包)

const cs = [{a:1}, {b:2}, {c:3}];
const f = (xs) => Object.assign(...xs);
const g = () => f(cs);

const cObj = g();

返回:

cs before assign: [ { a: 1 }, { b: 2 }, { c: 3 } ]cObj: { a: 1, b: 2, c: 3 }cs after assign: [ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]

这里出了什么问题?如何安全地使用Object.assign而不破坏它的第一个参数?

最佳答案

Object.assign 不是纯函数,它会覆盖其第一个参数 target

这是其在 MDN 上的条目:

Object.assign(target, ...sources)

Parameters

target

The target object — what to apply the sources’ properties to, which is returned after it is modified.

sources

The source object(s) — objects containing the properties you want to apply.

Return value

The target object.

关键短语是“[目标]修改后返回”。为了避免这种情况,请传递一个空对象文字 {} 作为第一个参数:

const aObj = Object.assign({}, ...as);

关于javascript - Object.assign(...as) 更改输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60045503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com