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

对数组副本执行unshift方法时原数组被修改,原因是什么?

为什么修改数组副本的unshift会影响原数组?

嘿,这个问题其实是JavaScript里引用类型的经典坑!我来给你掰扯清楚~

问题核心原因

在JavaScript中,数组属于引用类型。当你执行var array2 = array1这行代码时,并不是把array1里的元素完整复制一份给array2,而是让array2和array1指向了内存中同一个数组对象。打个比方,就像两个人拿着同一扇门的钥匙,不管谁开门进去修改屋里的东西,另一个人看到的都是修改后的结果。

看你的代码示例就能明白:

var array1 = [1, 2, 3]
var array2 = array1 // 这里只是复制了"指向数组的引用",不是数组本身
array2.unshift(4, 5) // 本质是操作共享的那个数组对象
console.log(array1) // 输出 [4, 5, 1, 2, 3]
console.log(array2) // 输出 [4, 5, 1, 2, 3]

怎么创建真正独立的数组副本?

如果你想修改array2却不影响array1,就得创建数组的浅拷贝,常用的方法有这几种:

  • 使用扩展运算符(最简洁的方式):
var array2 = [...array1]
  • 使用slice()方法:
var array2 = array1.slice()
  • 使用Array.from():
var array2 = Array.from(array1)

用这些方法创建副本后,再执行unshift就只会修改array2了:

var array1 = [1, 2, 3]
var array2 = [...array1]
array2.unshift(4, 5)
console.log(array1) // 输出 [1, 2, 3]
console.log(array2) // 输出 [4, 5, 1, 2, 3]

小提醒:如果数组里包含嵌套对象、其他数组这类引用类型元素,浅拷贝还是会共享这些内部引用,这时候需要用深拷贝(比如JSON.parse(JSON.stringify(array1))或者专门的工具函数),但对于元素都是数字、字符串这类基本类型的简单数组,上面的浅拷贝方法完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:23:55