shadowClone & deepClone,对于 Symbol 类型的 key,它是无法通过 for ...in... 遍历的,需要通过专有API Object.getOwnPropertySymbols(obj) 去获取。
1. shadowClone
// 只考虑 source 为 Array 或者 Object
function shadowClone(source) {
var target;
if (Array.isArray(source)) {
target = []
} else {
target = {}
}
for(let key in source) {
if (source.hasOwnProperty(key)) {
target[key] = source[key]
}
}
return target;
}
// 用例
var source = { name: 1, person: { name: 2 }}
var res = shadowClone(source);
console.log(res.person === source.person) // true
// 只考虑 source 为 Array 或者 Object
function shadowClone(source, target) {
for(let key in source) {
if (source.hasOwnProperty(key)) {
target[key] = source[key]
}
}
}
// 用例
var source = { name: 1, person: { name: 2 }}
var target = {}
shadowClone(source, target);
console.log(target.person === source.person) // true
2. deepClone
function deepClone(obj, hash = new WeakMap()) {
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
if (obj === null || typeof obj !== 'object') return obj;
// 循环引用的情况
if (hash.has(obj)) {
return hash.get(obj)
}
let result = new obj.constructor();
hash.set(obj, result);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key], hash)
}
}
let symbols = Object.getOwnPropertySymbols(obj)
for (let i = 0; i < symbols.length; i++) {
if (obj.hasOwnProperty(symbols[i])) {
result[symbols[i]] = deepClone(obj[symbols[i]], hash)
}
}
return result
}
// 测试用例
var wife = {
name: 'age',
age: 25,
[Symbol()]: 222,
children: [
{
name: 'name',
age: 26,
}
]
}
wife.self = wife;
var target = deepClone(wife);
console.log(target)
网友评论