在js中克隆被分为深度克隆和浅克隆
克隆的概念
深克隆
所有元素或属性完全复制,与原对象完全脱离,也就是说所有对新对象的修改都不会映射到原对象中
浅克隆
原始类型为值传递,对象类型仍为引用传递,所以改变新对象中的引用值会改变原对象中
var lilei = {
sname: 'Li Lei',
sage: 12,
cars: [1, 2, 3],
inrt() {
console.log(`I'm ${this.sname},I'm ${this.sage}`);
},
department: {
name: '研发一部',
address: '武汉',
}
}
浅克隆
原始类型为值传递,对象类型仍为引用传递
//origin 被克隆的对象
function clone(origin) {
//判断时是不是对象 如果不是则直接返回origin
if(typeof origin !== "object") {
return origin;
}
//判断是不是数组是数组就创一个是数组
var target = (origin instanceof Array) ? [] : {};
//遍历origin中的属性并赋值给target
for(const key in origin) {
target[key] = origin[key];
}
return target
}
var obj = clone(lilei);
console.log(obj);``
这是浅克隆出来的对象、
如果当改变新对象中的应用值原数组中也会改变
深克隆
所有元素或属性完全复制,与原对象完全脱离,
//origin 被克隆的对象
function clone(origin) {
//判断时是不是对象 如果不是则直接返回origin
if(typeof origin !== "object") {
return origin;
}
//判断是不是数组是数组就创一个是数组
var target = (origin instanceof Array) ? [] : {};
//遍历origin中的属性并赋值给target
for(const key in origin) {
//判断origin[key]是不是对象 如果是对象就调用clone(origin[key])
target[key] = (typeof origin[key] === "object" && origin[key] !== null) ? clone(origin[key]) : origin[key]
}
return target
}
var obj = clone(lilei);
console.log(obj);``
这是浅克隆出来的对象、
如果当改变新对象中的引用值原数组中不会会改变