对数组副本执行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
相关产品推荐
相关产品推荐

