这个javascript赋值有什么不同?

这个javascript赋值有什么不同?,javascript,arrays,Javascript,Arrays,这两个作业有什么区别 这个.list.push…response.data; //vs this.list=[].concatthis.list,response.data 结果在内容上是一样的。 response.data中包含的项目将被追加到此.list中 但是,使用这个.list.push…response.data,列表保持不变,只是用新的项展开,所以列表被修改到位。任何对该列表的引用都将看到更改发生 使用[].concatthis.list、response.data创建一个新列表。

这两个作业有什么区别

这个.list.push…response.data; //vs this.list=[].concatthis.list,response.data 结果在内容上是一样的。 response.data中包含的项目将被追加到此.list中

但是,使用这个.list.push…response.data,列表保持不变,只是用新的项展开,所以列表被修改到位。任何对该列表的引用都将看到更改发生

使用[].concatthis.list、response.data创建一个新列表。此新列表是两个列表的串联,然后重新分配给This.list。因此,在赋值之后,这个.list指向一个新列表。在这种情况下,对旧列表的任何引用都不会看到更改发生。

TL;博士

第一个是不纯净的,第二个是纯净的,尽管看起来它是在一个已经不纯净的环境中完成的

解释

如果使用.push,则会更改.push所在的数组,因为.push会将一项添加到现有数组的末尾

.concat将创建一个新数组,并将其他数组附加到新数组中。这样,就不会更改原始阵列。

回答: 第一个例子:

该示例使用push对数据进行变异。这意味着阵列将在适当的位置进行更改。这被认为是不纯的,因为它不会返回新对象-它会更改已经存在的数据

第二个例子:

此示例返回一个新的数组对象。这意味着它遵循功能范式。它被认为是纯粹的,因为它不会改变现有的数组,它会根据需要创建一个新的数组

就这些吗? 现在你可能会想其他答案也是这么说的

你说得对。起初我只是想写一份附录,但我想我还是简明扼要地提供所有信息为好。答案的第一部分似乎是重复,因为他们是正确的,而且……好吧,你无法战胜这一点。然而 以下是他们错过的:

其他差异: 如果要查看concat的内部,您会看到该方法本身检查Symbol.isConcatSpreadable是true还是false。这可能会让您相信,如果spreadable为true,那么在Array Objects中默认情况下,它们的执行方式是相同的。这根本不是事实


在内部,spread运算符使用elements@@迭代器组合数组/值,而Array.prototype.concat方法是按字面意思构建的,就像for循环一样,即i=0;i首先将项目添加到现有的this.list中。第二个将this.list和response.data合并到一个新数组中,并将结果分配给this.list。this.list是否声明为一个数组开始?你每行都跑了吗?它们是否创建相同的输出?是否有实际的问题或你正在试图解决的问题或你只是好奇?是的,此.list是一个数组,用于更多的参考、比较和。它被称为扩展运算符,在其他语言中也被称为splat运算符。抱歉,在我回答时,没有看到你已经回答。因为你跑得更快,答案是正确的:@David,别担心!两种解释比一种解释好!回答得好!只是想让你们知道,我投了赞成票并补充了另一个答案。不是因为你错了,而是因为我认为你错过了一些东西:好答案!只是想让你们知道,我投了赞成票并补充了另一个答案。不是因为你错了,而是因为我认为你错过了几件事:
this.list.push(...response.data);
this.list = [].concat(this.list, response.data);