如果它是引用类型,为啥我可以清空一个数组? [复制]
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 指向的引用.希望我没看错,非常感谢!
没错,你明白了!以上是关于如果它是引用类型,为啥我可以清空一个数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章