完整实现方法1
Es6新增的Symbol由于不是引用类型,只有深拷贝
WeakMap和WeakSet由于无法遍历,无法深拷贝
function extend(parent, children) {
var i,
toStrF = Object.prototype.toString,
strC = "[Object Array]"
children = children || {}
for (i in parent) {
if (parent.hasOwnProperty(i)) {
if (typeof parent[i] === "object") {
if(parent[i] instanceof Set) {
children[i] = new Set([...parent[i]])
} else if(parent[i] instanceof Map) {
children[i] = new Map([...parent[i]])
} else {
children[i] = (toStrF.call(parent[i]) === strC) ? [] : {};
extend(parent[i], children[i])
}
} else {
children[i] = parent[i]
}
}
}
return children
}
实现方法2
利用JSON.parse(JSON.stringify())做属性拷贝,但是需注意此方法会丢失如时间对象,正则对象等
function extend(parent, children) {
children = children || {}
for( i in parent) {
if(parent.hasOwnProperty(i)) {
children[i] = parent[i]
}
}
children = JSON.parse(JSON.stringify(children))
return children
}
实现方法3
如果需要复制的对象属性中没有引用类型时,可直接用...
let a = {...b}