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] = 5console.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] = 5console.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] = 5console.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] = 5console.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] = 5console.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}
