如果它是引用类型,为啥我可以清空一个数组? [复制]

Posted

技术标签:

【中文标题】如果它是引用类型,为啥我可以清空一个数组? [复制]【英文标题】:Why can i empty one array if it is a reference type? [duplicate]如果它是引用类型,为什么我可以清空一个数组? [复制] 【发布时间】:2020-05-21 20:52:13 【问题描述】:

我目前正在学习 JS 中的数组。

令我困惑的是,像对象这样的数组是引用类型。

因此,考虑到这一点,如果我为同一个数组创建一个新引用(变量)并将其清空,无论我使用 'const' 还是 'let' 关键字声明它,它都应该始终在两个引用处清空数组。

但是,如果我使用 'let' 关键字重新分配原始数组,我可以清空原始数组,但属于新引用的数组不会被清空?

我认为下面的代码更清楚:


const array1 = [1, 2, 3]
const array2 = array1

array1.length = 0;

console.log(array1) //Outputs []
console.log(array2) //Outputs []

//So both arrays are emptied which makes sense as a reference type but...

let array3 = [1, 2, 3]
let array4 = array3

array3 = []

console.log(array3) //Outputs []
console.log(array4) //Outputs [1,2,3]

//what is going on here? I thought all arrays are reference types regardless of using const or let?

【问题讨论】:

尝试相同的方法 - 你怎么知道array1.length = 0; !== array3 = []。此外,似乎 array3 会分配新值,而 array4 会在内存中保留对 [1,2,3] 的引用 它可能是一个引用类型,但就像一个对象一样,这意味着你需要改变这个对象。用其他对象覆盖 array3 引用不会对现有数组对象做任何事情。 您误解了引用类型。当您说array2 = array1 时,您并不是在创建对array1 的引用,而是在创建对数组的引用array1 也是对 的引用。然后,当您说 array3 = [] 时,您将该引用指向一个新数组,但 array4 仍指向原始数组。 @Ivar 好电话,已添加 如果 1 你正在改变 1 和 2 都指向的数组。如果 2 你说 3 现在指向一个新数组而不触及 4 指向的那个数组。完成。 【参考方案1】:

您实际上并没有清空原始数组,而是将 array3 重新分配到一个全新的数组。另一方面,Array4 仍然指向创建 array3 的原始数组。

创建 array4 时,它与 array3 的值没有内在联系,而是与创建 array3 时使用的数组相关联。

【讨论】:

好的,我想我现在明白了!因为 array1 和 array2 都指向同一个引用,并且因为 array1 被初始化为一个常量,所以我不能将它从指向空数组的数组引用重新分配。因此,因为当我执行array3 = [] 时,array3 是使用“let”关键字初始化的,所以我将其从指向数组引用中释放出来,而是为它分配一个全新的数组,而 array4 仍然持有对原始引用 array3 指向的引用.希望我没看错,非常感谢! 没错,你明白了!

以上是关于如果它是引用类型,为啥我可以清空一个数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如果结构是值类型,为啥我可以新建它? [复制]

如果存在 VLA,为啥仍然需要 malloc? [复制]

为啥需要布尔返回类型? [复制]

为啥我的数组值会发生变化? [复制]

为啥我不能创建一个 NSLayoutConstraint 类型的数组? [复制]

JavaScript - 通过引用传递时清空数组/对象问题