深拷贝的几种方法
方法一:
function deepClone(obj) {
const result = obj.constructor === Array ? [] : {} //判断obj是否是数组,然后创建数组或者对象
if(obj && typeof obj === 'object'){
for (let key in obj) {
if (obj[key] && typeof obj[key] === 'object') {
result[key] = deepClone(obj[key])
} else {
result[key] = obj[key]
}
}
return result
}
return obj
}
const arr1 = [1,2,3,4,{}]
const arr2 = deepClone(arr1)
arr1.push(6)
console.log('arr1:', arr1, 'arr2:', arr2)
const obj1 = {a:2, b:3, c:4}
const obj2 = deepClone(obj1)
Object.assign(obj1, {d:5})
console.log('obj1:', obj1, 'obj2:', obj2)
方法二:
JSON.parse(JSON.stringify(obj))
方法三
let deepClone = function (obj) {
// Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。
// 创建一个以obj的原型链为原型的空对象
let copy = Object.create(Object.getPrototypeOf(obj));
// getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
// 创建数组,以obj的属性为对象的数组
let propNames = Object.getOwnPropertyNames(obj);
console.log(propNames)
propNames.forEach(function (key) {
// getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
// 找到obj上面 items对象的值
let value = Object.getOwnPropertyDescriptor(obj, key);
// copy对象代理属性
Object.defineProperty(copy, key, value);
});
return copy;
};

浙公网安备 33010602011771号