Open fedono opened 3 years ago
主要考察的是递归、数组和对象的存储。
for ... in
的形式function deepClone(obj) {
// 注意点:深复制这里应该是[...obj] : {...obj} 而不应该是 [] : {} ,为什么呢?
var result = Array.isArray(obj) ? [...obj] : {...obj} ;
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key]!==null) {
result[key] = deepClone(obj[key]);
} else {
result[key] = obj[key];
}
}
}
return result;
}
function deepClone(obj) {
function isObject(o) {
return (typeof o === 'object' || typeof o === 'function') && o !== null
}
if (!isObject(obj)) {
throw new Error('非对象')
}
let isArray = Array.isArray(obj)
let newObj = isArray ? [...obj] : { ...obj }
Reflect.ownKeys(newObj).forEach(key => {
newObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
})
return newObj
}
JSON.parse/JSON.stringify
的形式function deepClone(arr){
return JSON.parse(JSON.stringify(arr))
}
对于上面说的
注意点:深复制这里应该是[...obj] : {...obj} 而不应该是 [] : {}
这一句还是没太明白,使用 [] : {}
来测试还是能够实现深复制啊
function deepClone(obj) {
// 注意点:深复制这里应该是[...obj] : {...obj} 而不应该是 [] : {} ,为什么呢?
let result = Array.isArray(obj) ? [] : {};
// var result = Array.isArray(obj) ? [...obj] : {...obj} ;
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
result[key] = deepClone(obj[key]);
} else {
result[key] = obj[key];
}
}
}
return result;
}
let obj = {
a: 1,
b: {b1: 1, b2: 2},
c: [1, 2],
d: function() {}
};
let res = deepClone(obj);
console.log(res.b === obj.d) // false
console.log(res) // obj 的全部复制了
浅拷贝: 仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深拷贝: 在计算机中开辟一块 新的内存地址 用于存放复制的对象。
深拷贝和浅拷贝最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。
浅拷贝实现方法:
深拷贝实现方法: