为何JavaScript数组表现不符合预期?引用类型赋值疑问
let arr1 = [1, 2, 3, 4, 5]; let arr2 = arr1; console.log(arr1 === arr2); arr1 = [1, 2]; console.log(arr1 === arr2); console.log('array1 ', arr1); console.log('array2 ', arr2);
问题解答
你混淆了修改引用指向和修改引用指向的对象内容这两个操作:
- 执行
let arr2 = arr1时,arr1和arr2确实指向同一个数组对象,所以第一次console.log(arr1 === arr2)输出true——因为它们引用的是内存里同一个对象。 - 但你后续写的
arr1 = [1, 2],并不是修改原来那个数组的内容,而是给arr1变量重新赋值了一个全新的数组对象。这时候arr1的引用地址换成了新数组的地址,而arr2还死死指着原来的数组,所以两者不再相等,arr2的值自然不会跟着变。
如果要让arr2跟着变化,你得修改原来数组的内容,而不是给arr1重新赋值新数组,比如:
let arr1 = [1, 2, 3, 4, 5]; let arr2 = arr1; // 修改原数组内容,而非重新赋值 arr1.splice(2); // 从索引2开始删除元素,原数组变为[1,2] console.log(arr1 === arr2); // 仍然输出true console.log('array1 ', arr1); // [1,2] console.log('array2 ', arr2); // [1,2]
核心点:
- 引用类型变量存的是对象的内存地址,赋值时传递的是地址,所以两个变量指向同一个对象。
- 直接给变量赋值新对象,会改变变量的引用地址,和原对象彻底脱钩。
- 只有修改引用指向的对象本身的内容,才会让所有指向该对象的变量同步看到变化。
内容的提问来源于stack exchange,提问作者Shubham Negi
相关产品推荐
相关产品推荐

