【问题标题】:Is a spreaded Array pushed to another array by value or reference in Javascript?在 Javascript 中,是否通过值或引用将扩展数组推送到另一个数组?
【发布时间】:2022-10-24 11:50:04
【问题描述】:

示例 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 数组将通过引用推送到activeHobbies 而不会像这样activeHobbies.push(hobbies) 传播,如果新值被推送到activeHobbies 数组中,新值将添加到activeHobbies 数组中的hobbies 数组@array,因为它是通过引用推送的。这是对的吗?

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

【问题讨论】:

  • 例如2,原因是由于您的浏览器记录了已记录对象的实时引用(因此在记录时它不显示对象,而是在您观察日志时显示对象-@ 987654321@)

标签: javascript arrays reference


【解决方案1】:

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

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

为什么activeHobbies 没有变化?

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

新值将被添加到hobbies 数组 […],如果新值被推送到 hobbies 数组

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

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

这只是interactive console.log reprentation 的神器。在您推送值之前,它实际上并没有输出。

【讨论】:

    【解决方案2】:

    谈到示例 1,当您将 hobbies 的展开值推送到 activeHobbies 时,这是一个一次性操作,其中包含在 hobbies 数组中的原始值被克隆并添加到 activeHobbies。原始的hobbies 数组根本没有改变,并且完全独立于activeHobbies。因此,当您稍后将新数组项添加到 hobbies 时,activeHobbies 完全不受影响,因为这两个数组没有以任何方式链接,并且添加到一个数组的值不会自动出现在另一个数组中而不会被推送到每个数组。 Push 与扩展运算符相当于一次性串联两个数组。

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 2022-01-20
      • 2015-06-01
      • 2020-11-25
      • 2021-07-22
      相关资源
      最近更新 更多