1.数组的浅拷贝
var a = [1,2,3,4]
var b = a
2.一维数组的深拷贝
1.splice方法
var a = [1,2,3,4]
var b = a.slice()
a[0] = 5
console.log(a) // [5,2,3,4]
console.log(b) // [1,2,3,4]
2.cocat方法
var a = [1,2,3,4]
var b = a.concat()
a[0] = 5
console.log(a) // [5,2,3,4]
console.log(b) // [1,2,3,4]
3.循环
var a = [1,2,3,4]
var b = cloneArray(a);
a[0] = 5
console.log(a) // [5,2,3,4]
console.log(b) // [1,2,3,4]
function cloneArray(arr) {
const newArray = []
for(let i = 0; i < arr.length; i++) {
newArray.push(arr[i])
}
return newArray
}
4.es6新特性之扩展运算符
var a = [1,2,3,4]
var b = [...a]
a[0] = 5
console.log(a) // [5,2,3,4]
console.log(b) // [1,2,3,4]
5.es6新特性之Array.from
var a = [1,2,3,4]
var b = Array.from(a);
a[0] = 5;
console.log(a) // [5,2,3,4]
console.log(b) // [1,2,3,4]
3.多维数组的深拷贝
1.json.parse()和json.stringify()
var a = [1,[2,3],4]
var b = JSON.parse(JSON.stringify(a));
a[1][0] = 5;
console.log(a) // [1,[2,3],4]
console.log(b) // [1,[5,3],4]
- 拷贝的对象的值中如果有函数,undefined,symbol则经过JSON.stringify()序列化后的JSON字符串中这个键值对会消失
- 无法拷贝不可枚举的属性,无法拷贝对象的原型链
- 拷贝Date引用类型会变成字符串
- 拷贝RegExp引用类型会变成空对象
- 对象中含有NaN、Infinity和-Infinity,则序列化的结果会变成null
- 无法拷贝对象的循环应用(即obj[key] = obj)
2.循环+递归
var a = [1,[2,3],4]
var b = deepClone(a);
a[1][0] = 5
console.log(a);
console.log(b);
function deepClone(arr) {
if(!arr || typeof arr !== 'object'){
return arr
}
const newArr = []
for(var key in arr) {
if(typeof arr[key] ==='object'){
newArr[key] = deepClone(arr[key])
}else {
newArr[key] = arr[key]
}
}
return newArr
}