Javascript 如果一个数组是引用类型,为什么要清空它?

Javascript 如果一个数组是引用类型,为什么要清空它?,javascript,arrays,Javascript,Arrays,我目前正在学习JS中的数组 让我困惑的是,像对象这样的数组是引用类型 因此,考虑到这一点,如果我为同一数组创建一个新引用(变量)并清空它,无论我使用“const”或“let”关键字声明它,它都应该在两个引用处清空数组 但是,如果我使用'let'关键字重新分配原始数组,我可以清空原始数组,但是属于新引用的数组不会清空吗 我认为下面的代码更清楚地说明了这一点: const array1 = [1, 2, 3] const array2 = array1 array1.length = 0; c

我目前正在学习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?

实际上,您并不是清空原始阵列,而是将阵列3重新分配给一个全新的阵列。另一方面,Array4仍然指向创建array3时使用的原始数组


创建array4时,它本身并不与array3的值关联,而是与创建array3时使用的数组关联

尝试同样的方法-如何判断
array1.length=0!==<代码>阵列3=[]
。此外,array3将分配新值,array4将在内存中保留对[1,2,3]的引用。它可能是引用类型,但与对象类似,这意味着您需要修改对象。用其他引用覆盖
array3
引用不会对现有数组对象产生任何影响。您误解了引用类型。当您说
array2=array1
时,您不是在创建对array1的引用,而是在创建对array1也是其引用的数组的引用。然后,当您说
array3=[]
时,您将该引用指向一个新数组,但array4仍指向原始数组。@Ivar Good call,在案例1中添加了它,您正在变异1和2都指向的数组。在案例2中,您是说3现在指向一个新数组,而不触及4所指向的数组。好了,我想我现在明白了!因为array1和array2都指向同一个引用,而且array1被初始化为一个常量,所以我无法将它从指向数组引用重新分配给空数组。因此,由于array3是在我执行
array3=[]
操作时使用“let”关键字初始化的,因此我将其从指向数组引用中释放出来,而是为其分配一个全新的数组,而array4仍然保留对array3指向的原始引用的引用。希望我没弄错,谢谢!没错,你说对了!