javascript - Object.assign(...as) 更改输入参数
问题描述
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 (<anonymous>) 处不可扩展
这表明该论点确实正在改变。
真正让我感到困惑的是,即使绑定我的数组,,cs
也可以通过将它currying到一个函数(我认为你在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
不是纯函数,它会覆盖它的第一个参数target
。
这是它在MDN上的条目:
Object.assign(目标,...来源)
参数
目标
目标对象 - 将源的属性应用到什么,修改后返回。
来源
源对象 — 包含您要应用的属性的对象。
返回值
目标对象。
关键短语是“[目标]被修改后返回”。为避免这种情况,请将空对象文字{}
作为第一个参数传递:
const aObj = Object.assign({}, ...as);
推荐阅读
- ruby-on-rails - Rails Action Mailer 在本地工作,但不能在生产环境中工作:Heroku:内部服务器错误
- python - 绘制熊猫 DataframeGroupbySeries 的 HIST
- javascript - 电子没办法换驱动?
- spring - 如果注解包含参数,建议不会执行
- google-chrome - Firefox Native addon(win7):如何在给定 Windows HWND 的情况下获取 window.id
- javascript - Chrome 扩展:如何在 2021 年安装类似 choex 的 ES6 npm 脚本?
- laravel - 如何在 Laravel 6 中隐藏 url 中的 id?
- ruby-on-rails - 安装 ruby-opencv gem 时出错,找不到 opencv_calib3d
- php - 如何在 Xampp 中将一个包从 github 安装到普通 PHP 中
- swift - 当我想过滤数据时,领域中的错误属性名称无效,找不到属性