js对象克隆就是将一个对象的属性方法赋值给另外一个空对象,我们先来了解一下js对象。在js中一切实例皆是对象具体分为原始类型和合成类型,原始类型对象指的是Undefined 、Null 、Boolean 、Number 和 String ,按值传递,合成类型对象对象指的是array 、object以及function ,按址传递,传递的时候是内存中的地址。而对象的克隆拷贝也因此分为两种,浅度克隆和深度克隆,浅度克隆是指基本类型为值传递,对象仍为引用传递,深度克隆是指所有元素或属性均完全克隆,并于原引用类型完全独立,即就是在后面修改对象的属性的时候,原对象不会被修改,下面介绍几种对象深度克隆的方法。
1.遍历深度克隆法
function deepClone (obj) {
let newObj = {};
if (obj instanceof Array) {
newObj = [];
}
for (let key in obj) {
let val = obj[key];
newObj[key] = typeof val === 'object' ? cloneObj(val): val;
}
return newObj;
};
换用toString()方法
function deepClone(origin, target) {
var target = target || {};
toStr = Object.prototype.toString, //对象调用toSting()
arrStr = "[obect Array];"
for(var prop in origin) {
if(origin.hasOwnProperty(prop)) { //判断是否是原型上的属性还是自己的属性
if(origin[prop] !== "null" && typeof(origin[prop]) == "object") { //判断是数组还是对象且复制者不能为空
if(toStr.call(origin[prop]) == arrStr) {
target[prop] = [];
} else {
target[prop] = {};
}
deepClone(origin[prop], target[prop]);
} else {
target[prop] = origin[prop]; //递归调用
}
}
}
return target;
}
这种遍历克隆是通用的对象深度克隆,把obj的value当做只有普通值、数组和函数,先正常的处理,然后再考虑之前的普通值有可能是object,所以这里做个判断,在递归一下clone函数就可以了
2.对象序列化深度克隆
let newObj = JSON.parse(JSON.stringify(obj)
这种方法也常用于我们发请求拿到结果为字符串的时候需要对数据进行处理
3.ES6 Object.assign新方法
let newObj = Object.assign({}, obj)
这种ES6的方法是我们比较常见的深度克隆方法
4.ES6扩展运算符
let newObj = {...obj}
这种方法是将原obj对象首先转化为数组,然后在转化为对象,原理类似对象序列化

被折叠的 条评论
为什么被折叠?



