简单实现浅拷贝与深拷贝
深浅拷贝区别
浅拷贝只复制第一层可枚举的属性值,深拷贝对每一层里的可枚举的属性值都进行复制。
-
简单实现浅拷贝
function copy (source) {
if (source === null || typeof source !== 'object') return source;
const copy = Array.isArray(source) ? [] : {};
Object.keys(source).forEach(key => {
copy[key] = source[key]
})
return copy
}
浅拷贝的实现有
Object.assign
...
展开语法Array.prototype.slice()
- 数组的
concat
-
简单实现深拷贝
function deepCopy (source) {
if (source === null || typeof source !== 'object') return source;
const copy = Array.isArray(source) ? [] : {};
Object.keys(source).forEach(key => {
copy[key] = deepCopy(source[key])
})
return copy
}
JSON.parse(JSON.stringify(source))
是对深拷贝的实现
但存在如下问题:
- 拷贝JSON中不支持的类型会有问题,如
Date
类型拷贝时,会转化为带T格式的日期字符串