Javascript 分配和扩展数组之间有什么区别?

Javascript 分配和扩展数组之间有什么区别?,javascript,arrays,Javascript,Arrays,最近,我在一次挑战练习中发现: let array = [1, 2, 3, 4, 5] let x = array let y = [...array] console.log(x, y); x和y理论上看起来是一样的,但显然在引擎盖下它们是不一样的,因为一个通过了测试,另一个没有通过 这里有我遗漏的东西吗。到目前为止,分配和传播对我来说几乎是一样的事情 谢谢区别与Javascript中对象的引用方式有关 虽然简单(标量)类型(如number和string)在每次引用时都会被复制,但对象(

最近,我在一次挑战练习中发现:

let array = [1, 2, 3, 4, 5]

let x = array
let y = [...array]

console.log(x, y);
x
y
理论上看起来是一样的,但显然在引擎盖下它们是不一样的,因为一个通过了测试,另一个没有通过

这里有我遗漏的东西吗。到目前为止,分配和传播对我来说几乎是一样的事情


谢谢

区别与Javascript中对象的引用方式有关

虽然简单(标量)类型(如number和string)在每次引用时都会被复制,但对象(数组从对象继承)是通过引用传递的


因此,在您的代码中,当将数组展开到括号中时,您正在实例化一个新数组,并接收到一个指向不同对象的指针。

使用赋值运算符时,您不会创建数组的copy,而是创建对同一数组的引用copy,因此如果更改x,原始数组也将更改..但使用spread运算符,它们是独立的数组,因此不会相互影响。

让x=array仅使
x
变量和
array
变量都指向相同的数组:

array−−−+ | +−−−−−−−−−+ +−−−>| (array) | | +−−−−−−−−−+ x−−−−−−−+ | 0: 1 | | 1: 2 | | 2: 3 | | 3: 4 | | 4: 5 | +−−−−−−−−−+ 由于数组是可变的(您可以更改它们的状态),这一点很重要,因为如果要进行更改而不想更改原始数组,则需要第二个(或类似的数组),而不是第一个



可能值得注意的是
让y=[…数组]
还创建一个数组,即使
数组
不是一个,只要它是可iterable,因为任何可iterable都可以这样扩展。例如,
let y=[…“foo”]
创建如下数组:
[“f”、“o”、“o”]
因为字符串是可编辑的。

简单赋值不会复制源数组;排列分配通过了什么测试?但是改变x不会改变上面的数组?!对吗?它会的,这正是区别所在。
array[0]=“A”;x[1]=“x”;y[2]=“y”;log(array,x,y)
它们不是通过引用传递的,它们是引用类型的值,因此可以说它们是作为引用传递的。passby-reference指的是JavaScript不具备的一种非常特殊的行为;变量y=x;x=21;//y也是21。无论我们处理值类型值还是引用类型值,JavaScript都不是这样工作的。这是一个单词,但它有很大的不同。 +−−−−−−−−−+ array−−−−−−−>| (array) | +−−−−−−−−−+ | 0: 1 | | 1: 2 | | 2: 3 | | 3: 4 | | 4: 5 | +−−−−−−−−−+ +−−−−−−−−−+ y−−−−−−−−−−−>| (array) | +−−−−−−−−−+ | 0: 1 | | 1: 2 | | 2: 3 | | 3: 4 | | 4: 5 | +−−−−−−−−−+