1.什么是浅克隆?
只克隆对象的“表层”,如果对象的某一个属性是引用类型,则不进一步克隆它们,只是传递它们的引用。代码案例如下:
var obj1={
a:1,
b:2,
c:[11,22,33]
}
var obj2={}
for(var k in obj1){
//k是属性名,obj1[k]是对应的属性值
obj2[k]=obj1[k]
}
obj1.a++;
console.log(obj1) //{a:2.b:2}
console.log(obj2) //{a:1.b:2}
//如果对象里面有引用类型的属性时,则不会克隆
obj1.c.push(44)
console.log(obj1) //{a:2.b:2,c:[11,22,33,44]}
console.log(obj2) //{a:1.b:2,c:[11,22,33,44]}
可以使用for...in循环来实现对象的浅克隆。
2.什么是深克隆?
克隆对象的全貌,不论对象里面的属性是否是引用类型,都能将它们实现克隆。代码案例如下:
var sobj1 = {
a: 1,
b: 2,
c: [33, 44, {
m: 55,
n: 66,
p: [77, 88]
}]
}
function deepClone(o) {
//要判断o是对象还是数组
if(Array.isArray(o)) {
//数组
var result = []
for(var i = 0; i < o.length; i++) {
result.push(deepClone(o[i]))
}
} else if(typeof o == 'object') {
//对象
var result = {}
for(var k in o) {
result[k] = deepClone(o[k])
}
} else {
//基本类型值
var result = o
}
return result;
}
var sobj2 = deepClone(sobj1)
console.log(sobj2) //{a:1,b:2,c:[33,44,{m:55,n:66,p:[77,88]}]}
console.log(sobj1==sobj2) //false 因为它们是内存中不同的对象
sobj1.c.push(99)
console.log(sobj1) //{a:1,b:2,c:[33,44,{m:55,n:66,p:[77,88]},99]}
console.log(sobj2) //{a:1,b:2,c:[33,44,{m:55,n:66,p:[77,88]}]} ,因为没有存在藕断丝连
克隆是指克隆一个新的独立的东西出来,在原基础上修改东西并不会影响克隆出来的东西。。