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
相关产品推荐
相关产品推荐

