You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:45:42