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);