浅拷贝、深拷贝
2019-03-22 本文已影响0人
有灵魂
1、基本数据类型:string number boolean null undefined 的拷贝是按值拷贝,即为深拷贝
2、复杂数据类型:array object function 按引用操作,又分为浅拷贝和深拷贝
// 基本数据类型:
let arr = undefined
arr1 = arr
arr1 = 5
console.log(arr);
console.log(arr1);
复杂数据类型:
// 一维数组的深拷贝: 1、slice() 2、concat() 3、ES6: ...扩展符 4、Array.from()
let arr = [1, 2, 3]
arr1 = arr.slice()
arr1 = arr.concat()
arr1 = [...arr]
arr1 = Array.from(arr)
arr1[0] = 'b'
console.log(arr); // [1, 2, 3]
console.log(arr1); // ["b", 2, 3]
// 一级对象的深拷贝:1、ES6: Object.assign(tartget, ...sources) 2、ES6: ...扩展符
let obj = {a: 'a', b: 'b'}
obj1 = Object.assign({}, obj)
obj1 = {...obj}
obj1.a = 'a1'
console.log(obj); //{a: "a", b: "b"}
console.log(obj1); //{a: "a1", b: "b"}
// 多维数组,多维对象的深拷贝使用上述方法,无效, 即为浅拷贝
let arr = [{a: 'a'}, {b: 'b'}]
let arr1 = arr.concat()
arr1[0].a = 'a1'
console.log(arr); // [{a: 'a1'}, {b: 'b'}]
console.log(arr1); // [{a: 'a1'}, {b: 'b'}]
可以实现的方法:1、JSON.parse(JSON.stringify()) 2、递归
let arr = [{a: 'a'}, {b: 'b'}]
let arr1 = JSON.parse(JSON.stringify(arr))
arr1[0].a = 'a1'
console.log(arr); // [{a: 'a'}, {b: 'b'}]
console.log(arr1); // [{a: 'a1'}, {b: 'b'}]
递归:
function deepcopy(obj) {
if(typeof obj === 'object') { //说明参数是一个对象类型,但是数组也是对象,需要具体判断是不是数组类型。
var result = obj.constructor === Array ? [] : {};
for(let i in obj){ //遍历obj的每一项
result[i] = typeof obj[i] === "object" ? deepcopy(obj[i]) : obj[i];
}
}else{
var result = obj;
}
return result;
}
let arr = [{a: [11, 8]}, {b: 'b1'}]
let arr1 = deepcopy(arr)
arr1 = arr
arr1[0].a[0] = 'a2'
console.log(arr, 4, arr1);