Javascript 赋值(…作为)更改输入参数

Javascript 赋值(…作为)更改输入参数,javascript,Javascript,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第一

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

导致错误:

TypeError:无法添加属性b,对象不可扩展 在Function.assign()处

这表明论点确实在改变

真正让我感到困惑的是,即使是通过将数组cs转换为函数来绑定它(我想你在JS中称之为闭包)

返回:

赋值前的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

以下是它的条目:

分配(目标,…源)

参数

目标

目标对象-应用源属性的对象,修改后返回

来源

源对象-包含要应用的属性的对象

返回值

目标对象

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

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

这里也没有“咖喱功能”。关于你的开放性问题:试试另一个我更常与副作用联系在一起的术语是。但是你真的应该写“…不是一个纯函数”。任何函数都可以修改作为参数传入的对象。是的。但这确实是件坏事。即使是在Fortran 77中,人们也不赞成它。函数(有副作用)不应触碰它们的参数,请使用
procedure
Object.assign
还返回了修改后的第一个参数,这一事实具有额外的误导性。现在,你的评论让我明白了为什么人们可能会这么做。由于写入
o=Object.assign(o,…as)
o
绑定到一个新对象(更改引用),而在
const rubbishO=object.assign(o,…as)
中,在不更改o的绑定的情况下更改它。@Bergi我认为很明显,它不是一个纯函数,即没有副作用。我是从程序和功能的角度来思考的。现在,既然它引起的争议超过了它的价值,那么如何编辑它呢。让我们试试。。。附言:很高兴在这里见到你Bergi,在过去的几周里,我在这里读了很多你的答案。对于只有笨拙的ES6前代码作为答案的旧问题,您可以很好地获得当前答案。您应该使用
Object.assign({},…as)
,因为它修改了第一个参数。这是否回答了您的问题?
const cs = [{a:1}, {b:2}, {c:3}];
const f = (xs) => Object.assign(...xs);
const g = () => f(cs);                            

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