说说深浅拷贝的区别及实现
# 是什么
- 浅拷贝: 数据存储在栈中
- 深拷贝: 数据存储在堆中,引用指针存在栈中
# 怎么用
# 浅拷贝
- 直接相等 ==
- Object.assign
- concat
- slice
- 扩展字符串
function shallowClone(obj){
const newObj = {}
for(let key in obj){
if(obj.hasOwnProperty(key)){
newObj[key] = obj[key]
}
}
return newObj
}
# 深拷贝
- JSON.stringify: 忽略undefined 函数 symbol
- 递归循环
- _.cloneDeep()
- $.extend()
// _.cloneDeep()
const _ = require('lodash');
const obj1 = {
a: 1,
b: { f: { g: 1 } },
c: [1, 2, 3]
};
const obj2 = _.cloneDeep(obj1);
console.log(obj1.b.f === obj2.b.f);// false
// $.extend()
const $ = require('jquery');
const obj1 = {
a: 1,
b: { f: { g: 1 } },
c: [1, 2, 3]
};
const obj2 = $.extend(true, {}, obj1);
console.log(obj1.b.f === obj2.b.f); // false
// JSON.stringify
const newObj = JSON.parse(JSON.stringify(obj))
// 手写循环
const cloneDeep = (obj, hash = new WeakMap()) => {
if (obj === null) return obj;
if (typeof obj !== "object") return obj;
// 缓存
if (hash.get(obj)) return hash.get(obj);
let newObj = new obj.constructor();
hash.set(obj, newObj);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = cloneDeep(obj[key], hash);
}
}
return newObj;
};
const obj = {
name: 'A',
name1: undefined,
name3: function() {},
name4: Symbol('A')
}
const newObj = cloneDeep(obj)
console.log(newObj)
// {
// name: 'A',
// name1: undefined,
// name3: [Function: name3],
// name4: Symbol(A)
// }
# 原理
上次更新: 2021/12/19, 18:05:42