const shallowClone = target => {
if (typeof target === 'object' && target != null) {
const cloneTarget = Array.isArray(target) ? [] : {}
for (let targetKey in target) {
if (target.hasOwnProperty(targetKey)) {
cloneTarget[targetKey] = target[targetKey]
}
}
return cloneTarget
} else {
return target
}
}
/**
* 缺点
* 这个深拷贝函数并不能复制不可枚举的属性以及Symbol类型
* 这种方法只是针对普通的引用类型的值做递归复制
* 对象的属性里面成环,循环引用没有解决
* @param obj
* @returns {{}}
*/
function deepclone(obj) {
let cloneObj = {}
for (let key in obj) {
if (typeof obj[key] ===
cloneObj[key] = deepclone(obj[key])
} else {
cloneObj[key] = obj[key]
}
}
return cloneObj
}
const deepClone2 = function(obj, hash = new WeakMap()) {
if (obj.constructor === Date) {
return new Date(obj)
}
if (obj.constructor === RegExp) {
return new RegExp(obj)
}
if (hash.has(obj)) return hash.get(obj)
let allDesc = Object.getOwnPropertyDescriptor(obj)
let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc)
hash.set(obj, cloneObj)
for (let key of Reflect.ownKeys(obj)) {
cloneObj[key] =
isComplexDataType(obj[key]) && typeof obj[key] === 'function' ? deepClone2(obj[key], hash) : obj[key]
}
return cloneObj
}
const isComplexDataType = obj => (typeof obj === 'object' || typeof obj === 'function') && obj != null