两种javascript深拷贝的方法
原文链接 http://gengliming.com/2015/08/12/two-implements-of-js-deep-copy/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
递归
function deepCopy(obj) {
if (!obj || typeof obj !== 'object') return obj;
var target = isPlainObject(obj) ? {} : [],
property, val;
for (var key in obj) {
val = obj[key];
// 防止循环引用
if (val === obj) continue;
if (Array.isArray(val) || isPlainObject(val)) {
target[key] = deepCopy(val);
} else {
target[key] = val;
}
}
return target;
}
function isPlainObject(o) {
return Object.prototype.toString.call(o) === "[object Object]";
}
非递归
function deepCopy(obj) {
if (!obj || typeof obj !== 'object') return obj;
var target = isPlainObject(obj) ? {} : [],
auxlity = [
[target, obj]
];
while (auxlity.length) {
var item = auxlity.shift(),
to = item[0],
from = item[1];
for (var key in from) {
var prop = from[key];
// 防止循环引用
if (from === prop) continue;
if (Array.isArray(prop)) {
to[key] = [];
auxlity.push([to[key], prop]);
} else if (isPlainObject(prop)) {
to[key] = {};
auxlity.push([to[key], prop]);
} else {
to[key] = prop;
}
}
}
return target;
}
function isPlainObject(o) {
return Object.prototype.toString.call(o) === "[object Object]";
}