在JS中实现对象拷贝的思路
在JS中对象拷贝的场景比较常见。由于对象属性中可能存在引用类型,一般分为浅拷贝和深拷贝两种。这里总结一下常见思路,可以根据具体需求复杂度进一步完善。
浅拷贝
ES6的Object.assign方法
let copy = Object.assign({}, obj)
遍历复制
function shadowCopy(obj) {
if (!obj && typeof obj !== 'object') {
return;
}
let newObj = obj.constructor === ‘Array’ ? [] : {};
for (let prop in obj) {
if (obj.hasOwnProperty(prop)) {
newObj[prop] = src[prop];
}
}
return newObj;
}
深拷贝
JSON序列化方法
let copy = JSON.parse(JSON.stringify(obj))
该方法只能满足简单的情况,因为序列化JS对象时,只能处理能被json直接表示的数据结构。
递归复制
let copy = function(obj) {
if (!obj && typeof obj !== 'object') {
return;
}
let newobj = obj.constructor === Array ? {} : [];
for (let i in obj) {
if (obj.hasOwnProperty(i)) {
newobj[i] = typeof obj[i] === 'object' ? copy(obj[i]) : obj[i];
}
return newobj;
}
可能存在循环引用的问题,可以根据具体需求选择抛出错误或是跳过当次循环。
-- EOF --
添加在分类「
前端开发
」下,并被添加
「JavaScript」
标签。