Object.assign合并对象属于浅拷贝,只能合并一层,不能实现深拷贝。
为了实现深拷贝,可以使用以下方法:
function deepAssign() {
let name, options, src, copy
let length = arguments.length
// 记录要复制的对象的下标
let i = 1
// target默认是第一个参数
let target = arguments[0] || {}
// 如果target不是对象,我们是无法进行复制的,所以设为{}
if (typeof target !== 'object') {
target = {}
}
// 循环遍历要复制的对象
for (; i < length; i++) {
// 获取当前对象
options = arguments[i]
// 要求不能为空 避免extend(a,,b)这种情况
if (options != null) {
for (name in options) {
// 目标属性值
src = target[name]
// 要复制的对象的属性值
copy = options[name]
if (copy && typeof copy == 'object') {
// 递归调用
target[name] = deepAssign( src, copy)
} else if (copy !== undefined) {
target[name] = copy
}
}
}
}
return target
}
复制代码
使用如下:
代码的实现参考了Jquery中extend的实现。
参考链接