定义
function deepClone(variable,hash = new WeakMap()) {
let value
if(hash.has(variable)) return hash.get(variable) //解决对象相互引用的情况
if(getType(variable) === 'object') {
value = {}
// 不考虑key为Symbol类型的情况
// for(var key in variable) {
// value[key] = deepClone(variable[key])
// }
Object.getOwnPropertyNames(variable).concat(Object.getOwnPropertySymbols(variable)).forEach(key => {
value[key] = deepClone(variable[key],hash.set(variable,variable))
});
return value
}
if(getType(variable) === 'array') {
value = []
for(var i = 0, len = variable.length; i < len; i++) {
value[i] = deepClone(variable[i])
}
return value
}
return variable
}
function getType(val) {
return Object.prototype.toString.call(val).split(/\[object\s(.*)]/)[1].toLowerCase()
}
使用
let v1 = { a: 1 }
let v2 = deepClone(v1)
v2.a = 3
v2.a == v1.a // false