一、什么叫深度克隆。
浅克隆一般只是把obj1的引用赋值给obj2。深克隆就是完全复制另一个对象。
我们根据obj1复制一个对象obj2,当操作改变obj2的值时,不影响obj1的值。他们2个是完全独立的对象。
基本数据类型的赋值,都是深克隆。
二、深度克隆用到的技术点。
- typeof 操作符返回 String、 Number、 Boolean 、Undefined、 Object、 Function。
- Object.prototype.toString.call(obj) 返回obj对象的数据类型。
- for...in 循环,遍历数组的时候,返回数组下标;遍历对象的时候,返回对象的属性名。
三、深度克隆的实现。
//检查对象的类型 function checkType(target) { //用当前对象,调用Object的toString方法。 return Object.prototype.toString.call(target).slice(8,-1); } //深克隆的方法。 function clon(target) { let targetType = checkType(target); let result; if (targetType === 'Object'){ result = {}; }else if (targetType === 'Array'){ result = []; }else { return target; } for (let i in target){ let value = target[i];//拿到数组,或者对象的值。 if (checkType(target) === 'Object' || targetType === 'Array'){ //组装新的对象 result[i] = clon(value); }else { result[i] = value; } return result; } }
四、测试。
//测试 let obj1 = { username :"zs", age: 23, child :["z1","z2"] } let obj2 = clon(obj1); obj2.child = 3; //{username: "zs", age: 23, child: Array(2)} // {username: "zs", child: 3} console.log(obj1,obj2);