浅拷贝:
- 自己实现: ```javascript const checkoutType = (target) => Object.prototype.toString.call(target).slice(8, -1);
const shallowClone = (target) => { let result; if(checkoutType(target) === ‘Object’) { result = {}; } if(checkoutType(target) === ‘Arrary’) { result = []; } Object.keys.forEach((key) => { if(Object.protrotype.hasOwnProperty.call(target, key)) { result[key] = target[key]; } }) return result; }
2. Object.assign:
```javascript
const obj = {
name: '测试1',
age: 12,
}
const copyObj = Object.assign({}, obj);
- 数组api:
Array.prototype.concat(target) || Array.prototype.slice(start, end) || … (三点运算符)。
小知识:
Reflect.ownKeys() 获取对象的key 包括Symbol 相当于Object.getOwnPropertyNames(target) concat(Object.getOwnPropertySymbols(target)。
深拷贝:
1.手写
const isObj = (target) => {
return typeof(target) === 'Object' && target != null;
}
const deepClone1 = (target, hash = new WeakMap()) => {
if(!isObj) return target;
if (checkoutType(target) === 'Array') {
result = [];
} else if (checkoutType(target) === 'Object'){
result = {};
}
if (hash.has(target)) return hash.get(target);
hash.set(target, result);
Reflect.ownKeys(target).forEach((key) => {
if(isObj(target[key])) {
result[key] = deepClone1(target[key], hash);
} else {
result[key] = target[key]
}
})
return result;
}
- Json.parse(Json.stringify(target));
不能存放函数和underfined;
不要存放时间对象,否则会变成字符串形式;
不能存放 RegExp、Error 对象,否则会变成空对象;
不能存放 NaN、Infinity、-Infinity,否则会变成 null;