javaScript中复制一个数组的浅拷贝和深拷贝方法
在 JavaScript 中,复制数组有多种方法。以下是几种常用的方法:
1. 使用 slice()
方法
slice()
方法可以返回一个新的数组对象,这一新数组是由原数组的一个浅拷贝构成的(即只复制了一层,对于嵌套数组或对象,不会进行深拷贝)。
javascript复制代码
let originalArray = [1, 2, 3, 4, 5]; | |
let copiedArray = originalArray.slice(); | |
console.log(copiedArray); // 输出: [1, 2, 3, 4, 5] |
2. 使用 concat()
方法
concat()
方法也可以用于复制数组,它同样是一个浅拷贝。
javascript复制代码
let originalArray = [1, 2, 3, 4, 5]; | |
let copiedArray = originalArray.concat(); | |
console.log(copiedArray); // 输出: [1, 2, 3, 4, 5] |
3. 使用扩展运算符(Spread Operator)
扩展运算符(...
)可以很方便地复制数组,同样是一个浅拷贝。
javascript复制代码
let originalArray = [1, 2, 3, 4, 5]; | |
let copiedArray = [...originalArray]; | |
console.log(copiedArray); // 输出: [1, 2, 3, 4, 5] |
4. 使用 Array.from()
方法
Array.from()
方法可以从类似数组(array-like objects)或可迭代对象(iterable objects)创建一个新的数组实例,这也可以用于数组的浅拷贝。
javascript复制代码
let originalArray = [1, 2, 3, 4, 5]; | |
let copiedArray = Array.from(originalArray); | |
console.log(copiedArray); // 输出: [1, 2, 3, 4, 5] |
5. 使用 map()
方法
虽然 map()
方法通常用于对数组的每个元素执行一个函数并返回一个新数组,但你也可以简单地返回每个元素本身来实现数组的浅拷贝。
javascript复制代码
let originalArray = [1, 2, 3, 4, 5]; | |
let copiedArray = originalArray.map(x => x); | |
console.log(copiedArray); // 输出: [1, 2, 3, 4, 5] |
深拷贝
如果数组中包含对象或其他数组(即嵌套结构),以上方法只会进行浅拷贝。如果需要深拷贝,可以使用 JSON.parse(JSON.stringify(array))
,但这种方法有其局限性(例如,无法处理函数、undefined
、Symbol
等)。
javascript复制代码
let originalArray = [1, 2, {a: 3}, [4, 5]]; | |
let deepCopiedArray = JSON.parse(JSON.stringify(originalArray)); | |
console.log(deepCopiedArray); // 输出: [1, 2, {a: 3}, [4, 5]] |
或者,可以使用递归函数或库(如 Lodash 的 _.cloneDeep
)来实现深拷贝。
javascript复制代码
function deepCopy(obj) { | |
if (obj === null || typeof obj !== 'object') { | |
return obj; | |
} | |
if (Array.isArray(obj)) { | |
let copy = []; | |
for (let i = 0; i < obj.length; i++) { | |
copy[i] = deepCopy(obj[i]); | |
} | |
return copy; | |
} | |
let copy = {}; | |
for (let key in obj) { | |
if (obj.hasOwnProperty(key)) { | |
copy[key] = deepCopy(obj[key]); | |
} | |
} | |
return copy; | |
} | |
let originalArray = [1, 2, {a: 3}, [4, 5]]; | |
let deepCopiedArray = deepCopy(originalArray); | |
console.log(deepCopiedArray); // 输出: [1, 2, {a: 3}, [4, 5]] |
选择哪种方法取决于你的具体需求以及数组的内容。