上次写了深拷贝的实现方法,闲来无聊再写下浅拷贝的实现方法,在简单说下他们各自的特性。
// 浅拷贝,对 对象|数组 而言,它的第一层属性值如果是基本数据类型则完全拷贝一份数据,如果是引用类型就拷贝内存地址。
// 1
// obj.a = 0;
// obj.oo.a = 0;
// let obj2 = Object.assign({}, obj);
// console.log(
// obj, obj2
// )
// 2
// let obj2 = {...obj};
// obj.a = 0;
// obj.oo.a = 0;
// console.log(
// obj, obj2
// )
let arr = [1, 2, 3, {}, [1]];
// 数组 1
// let arr2 = [...arr];
// arr[0] = 0;
// console.log(arr, arr2)
// 2
// let arr2 = arr.slice(0);
// arr[0] = 0;
// console.log(arr, arr2)
// 3
// let arr2 = arr.filter(item => true);
// arr[0] = 0;
// console.log(arr, arr2)
// 4
// let arr2 = arr.map(item => item);
// arr[0] = 0;
// console.log(arr, arr2)
// 5
let arr2 = arr.concat();
arr[0] = 0;
arr[3].num = 1;
arr[4][0] = 11;
console.log(arr, arr2)
// 深拷贝就是不管是基本数据类型还是引用数据类型都重新拷贝一份, 不存在共用数据的现象
// 1
JSON.parse(JSON.stringify(data))
// 1、会忽略 undefined
// 2、会忽略 symbol
// 3、不能序列化函数
// 4、不能解决循环引用的对象
// 5、不能正确处理new Date()
// 6、不能处理正则
// 7、不能处理new Error()
// 2
function deepCopy(data) {
const type = Object.prototype.toString.call(data);
if (type == '[object Object]' || type == '[object Array]') {
const constructor = data.constructor;
let newData = new constructor();
for (let key in data) {
newData[key] = deepCopy(data[key])
}
return newData
} else {
return data
}
}