在Javascript中,是否通过值或引用将扩展数组推送到另一个数组



示例1

我有一个代码将一个扩展数组推到另一个:

const hobbies = ['Sports', 'Cooking'];
const activeHobbies = ['Hiking'];
activeHobbies.push(...hobbies);
console.log(activeHobbies); //['Hiking', 'Sports', 'Cooking']
hobbies.push('Skiing');
console.log(hobbies); //['Sports', 'Cooking', 'Skiing']
console.log(activeHobbies); //['Hiking', 'Sports', 'Cooking']

按值推送的扩展数组是否与activeHobbies.push(hobbies[0], hobbies[1])相同?

为什么最后一行没有['Hiking', 'Sports', 'Cooking', 'Skiing']

示例2

const hobbies = ['Sports', 'Cooking'];
const activeHobbies = ['Hiking'];
activeHobbies.push(hobbies);
console.log(activeHobbies); //['Hiking', ['Sports', 'Cooking', 'Skiing']], why not ['Hiking', ['Sports', 'Cooking']] ?
hobbies.push('Skiing');
console.log(hobbies); //['Sports', 'Cooking', 'Skiing']
console.log(activeHobbies); //['Hiking', ['Sports', 'Cooking', 'Skiing']]

据我所知,如果将新值推送到hobbies阵列,则hobbies阵列将通过引用推送到activeHobbies,而不会像activeHobbies.push(hobbies)那样扩展,并且新值将添加到activeHobbies阵列内的hobbies阵列,因为它是通过引用推送的。这是正确的吗?

但是为什么第一个控制台输出['Hiking', ['Sports', 'Cooking', 'Skiing']]而不是['Hiking', ['Sports', 'Cooking']]呢?

推送的扩展数组是否与activeHobbies.push(hobbies[0], hobbies[1])相同?

是。这适用于所有扩展语法函数调用,而不仅仅是push

为什么activeHobbies没有更改?

因为它独立于hobbies,所以没有连接,它们是两个独立的数组,您只将'Skiing'推送给其中一个。

如果新值被推送到hobbies阵列,则新值将被添加到hobbies阵列[…]

是。不管您是通过activeHobbies[1]还是通过hobbies变量查看数组,它毕竟是同一个对象。

为什么第一个控制台输出['Hiking', ['Sports', 'Cooking', 'Skiing']]而不是['Hiking', ['Sports', 'Cooking']]

这只是交互式console.log表示的一个工件。在你推送这个值之前,它实际上并没有输出这个值。

说到示例1,当您将hobbies的排列值推送到activeHobbies时,这是一次一次性操作,其中hobbies数组中包含的基元值被克隆并添加到activeHobbies。最初的hobbies阵列根本没有改变,并且仍然完全独立于activeHobbies。因此,当您稍后向hobbies添加新的数组项时,activeHobbies完全不受影响,因为这两个数组没有以任何方式链接,添加到其中一个数组的值不会自动出现在另一个数组中,而不会被推送到每个数组。具有扩展运算符的CCD_ 31相当于两个阵列的一次性级联。

最新更新