1、基于ES5语法
var deepClone = function (obj) {
var copy;
// 处理3种基础类型,和null、undefined
if (obj === null || typeof obj !== 'object') return obj;
// 处理日期
if (obj instanceof Date) {
copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// 处理数组
if (obj instanceof Array) {
copy = [];
for (var i = 0, len = obj.length; i < len; i++) {
copy[i] = AIMap.deepClone(obj[i]);
}
return copy;
}
// 处理函数
if (obj instanceof Function) {
copy = function () {
return obj.apply(this, arguemnts);
}
return copy;
}
// 处理对象
if (obj instanceof Object) {
copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = AIMap.deepClone(obj[attr]);
}
return copy;
}
throw new Error("Unable to copy obj as type isn't suported" + obj.constructor.name)
}
2、基于ES6 语法
let deepClone=function(value, hash = new WeakMap) { // WeakMap弱引用,不要用map
if (value == null) {
return null;
}
if (value instanceof RegExp) {
return new RegExp(value);
}
if (value instanceof Date) {
return new Date(value);
}
//函数不需要拷贝
if (typeof value != 'object') return value;
let obj = new value.constructor(); //判断是对象还是数组 并且new
if (hash.get(value)) { //如果这个对象拷贝过了 就返回那个拷贝的结果就可以了
return hash.get(value);
}
hash.set(value, obj); //如果这个对象没有拷贝过 就添加到WeakMap里面
for (let key in value) { // in 会遍历当前对象上面的属性和__proto__指代的属性
if (value.hasOwnProperty(key)) {
// 如果值还有可能是对象 就利用递归继续拷贝
obj[key] = deepClone(value[key], hash)
}
}
return obj;
}
网友评论