JavaScript高级手记(对象/数组的深浅拷贝)
var obj = {
a: 100,
b: [10,20,30],
c: {
x:10
},
d: /^\d+s/,
e: null,
f: undefined,
g: function(){},
h: new Date(),
i: Symbol('A'),
};
let arr = [10, [100,200], {x: 10, y: 20}];
let newObj = {...obj};
let newObj = Object.assign({}, obj);
let newObj = {};
for(let key in obj) {
if(!obj.hasOwnProperty(key)) break;
newObj[key] = obj[key];
}
let newArr = [...arr];
let newArr = Object.assign([], arr);
let newArr = arr.map(item => item);
newArr = arr.slice();
newArr = arr.concat([]);
console.log(arr, newArr);
console.log(arr === newArr);
console.log(arr[1] === newArr[1]);
let newArr = JSON.parse(JSON.stringify(arr));
console.log(arr, newArr);
console.log(arr === newArr);
console.log(arr[1] === newArr[1]);
newArr[1].push(99);
console.log(arr[1], newArr[1]);
let newObj = JSON.parse(JSON.stringify(obj));
console.log(obj, newObj);
* 进行拷贝时有问题:
这种办法存在BUG:把对象中的某些属性值变为字符串的时候,会存在问题
+ 正则变为 {}
+ 日期对象变为日期字符串
+ 属性值为 function/undefined/Symbol/BigInt 的属性会消失(直接不拷贝)
所以这种方法适用于数据值为 “number/null/boolean/普通对象/数组对象”等内容的对象/数组
*
function cloneDeep(obj) {
if(typeof obj !=='object') return obj;
if(obj === null) return null;
let constructor = obj.constructor;
if(constructor.name === 'RegExp') {
return new constructor(obj);
}
let clone = new constructor;
for(let key in obj) {
if(!obj.hasOwnProperty(key)) break;
if(obj === obj[key]) {
clone[key] = obj[key];
break;
}
clone[key] = cloneDeep(obj[key]);
}
return clone;
}
let newObj = cloneDeep(obj)
console.log(obj, newObj);
console.log(obj.g === newObj.g);
console.log(typeof obj.h, typeof newObj, obj.h === newObj.h);