示例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相当于两个阵列的一次性级联。