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

JS中数组赋值后清空原数组出现异常结果的原因探究

JavaScript数组赋值与引用的常见疑问解答

先看你的代码示例:

let numbers1 = [10,20,30,40];
let numbers2 = numbers1;

/* 
仅清空一个数组
numbers1=[]; */ 
/* 
同样仅清空一个数组
numbers1=0;*/

/* 会清空两个数组 */
numbers1.length = 0

console.log(numbers1);
console.log(numbers2);

问题1:这两个数组之间是否存在引用关系?

准确来说,不是数组之间存在引用,而是变量numbers1和numbers2指向了同一个数组对象。在JavaScript中,数组属于引用类型,执行let numbers2 = numbers1时,并没有复制整个数组,只是把numbers1存储的「数组对象的内存地址」复制给了numbers2,所以两个变量现在指向同一个数组实例。

问题2:如果存在引用,为什么前两种方式不影响第二个数组,而第三种方式或使用pop却会影响?

这是因为两种操作的本质完全不同:

  • 前两种操作(numbers1=[]/numbers1=0):给变量重新赋值
    执行numbers1=[]时,你并没有修改原来的数组对象,而是给numbers1这个变量重新分配了一个全新的空数组(numbers1=0则是赋值了一个基本类型值)。此时numbers1的指向发生改变,但numbers2依然指向原来的数组对象,所以numbers2的内容不会受影响。
  • 第三种操作(numbers1.length=0)或pop():修改对象本身
    这类操作是直接对numbers1指向的数组对象进行修改——修改length属性会直接清空数组内容,pop()会移除数组最后一个元素。因为numbers2和numbers1指向同一个数组对象,所以当这个对象的内容被修改时,通过numbers2访问到的自然也是修改后的结果。

内容的提问来源于stack exchange,提问作者Bhaumik Bhatt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:17:08