疑惑:Array作为引用类型,JS代码执行结果为何不符合预期?
为什么重新赋值数组变量后,另一个变量没有跟着变化?
你混淆了变量的引用赋值和修改引用指向的对象这两个操作,这是JS引用类型最容易踩的坑之一,拆解你的代码一步步看:
let a = [1, 2, 3]
这里a是一个变量,它存储的是指向内存中数组[1,2,3]的引用地址,而不是数组本身。let b = a
这一步是把a里存储的引用地址复制给了b,所以现在a和b都指向同一个数组对象。a = [1, 2]
这一步不是修改原来的数组,而是给a变量重新赋值了一个全新的数组引用——相当于a现在指向了内存中另一个新的数组[1,2],但b的引用地址还是原来那个[1,2,3]的地址,所以console.log(b)自然输出原来的数组。
如果要让b跟着变化,你需要修改的是引用指向的数组本身,而不是给变量重新赋值,比如:
let a = [1, 2, 3] let b = a a.pop() // 修改原来的数组,移除最后一个元素 console.log(b) // 输出 [1,2]
或者直接修改数组元素:
let a = [1, 2, 3] let b = a a[2] = 4 // 修改原数组的第三个元素 console.log(b) // 输出 [1,2,4]
总结:
- 引用类型变量存储的是对象的内存引用地址,而非对象本身
- 复制引用类型变量时,复制的是引用地址,两个变量会指向同一个对象
- 给变量重新赋值新对象,只会改变当前变量的引用地址,不会影响其他变量的引用
内容的提问来源于stack exchange,提问作者tunglam24
相关产品推荐
相关产品推荐

