深层克隆(复杂)

克隆:

浅层克隆

深层克隆

A是一个对象,B是一个空对象,我想把A的属性全部克隆到B身上,并且让A的属性和B没有任何联系,因为有的属性是引用值,你拷贝是拷的引用,他俩操作还是同一个人。

            var obj = {
				name : "abc",
				age : 123,
				card : ["visa","master"],
				wife : {
					name : "bcd",
					son : {
						name : "aaa"
					}
				}
			}
			var obj1 = {
				
			}
			function deepClone(origin,target){
				
				
				
			}	

我想把obj拷给obj1,看你是原始值还是引用值。

如果是原始值直接拿过来;如果是引用值,再看是数组还是对象,建立新数组,新对象,再看括号里面的是引用值还是原始值,依次循环。

总结:

  1. 判断是不是原始值;
  2. 判断是数组还是对象;
  3. 建立相应的数组或对象;
  4. 依次循环。
            var obj = {
				name : "abc",
				age : 123,
				card : ["visa","master"],
				wife : {
						name : "bcd",
						son : {
						name : "aaa"
					}
				}
			}
			var obj1 = {
				name : obj.name,
				age : 123,
				card :[obj.card[0],obj.card[1]],
				wife : {
					name : "abcd",
					son : {
						name : "aaa"
					}
				}
			}
			function deepClone(origin,target){
				
				
				
			}	

遍历对象for(var pro in obj)(数组也能遍历)

1.      判断是不是原始值;typeof()obj就是引用值,如果不是,很有可能就是原始值,null除外

2.      判断是数组还是对象;三种方法(instanceof,constructor,toString) ,建议用toString()

3.  建立相应的数组或对象;

4.依次循环.递归

        var obj = {
				name : "abc",
				age : 123,
				card : ["visa","master"],
				wife : {
						name : "bcd",
						son : {
						name : "aaa"
					}
				}
			}
			var obj1 = {
				
			}
			function deepClone(origin,target){
				var target = target || {},
					toStr = Object.prototype.toString,
					arrStr = "[object Array]";
				for(var pro in origin){
					if(origin.hasOwnProperty(pro)){
						if(typeof(origin[pro]) == "object"){
							if(toStr.call(origin[pro]) == arrStr){
								target[pro] = [];
							}else{
								target[pro] = {};
							}
							deepClone(origin[pro],target[pro]);
						}else{
							target[pro] = origin[pro];
						}
					}
				}
				
			}

完善一下:是不是还有null的问题!

        var obj = {
				name : "abc",
				age : 123,
				card : ["visa","master"],
				wife : {
						name : "bcd",
						son : {
						name : "aaa"
					}
				}
			}
			var obj1 = {
				
			}
			function deepClone(origin,target){
				var target = target || {},
					toStr = Object.prototype.toString,
					arrStr = "[object Array]";
				for(var pro in origin){
					if(origin.hasOwnProperty(pro)){
						if(origin[pro] != "null" && typeof(origin[pro]) == "object"){
							if(toStr.call(origin[pro]) == arrStr){
								target[pro] = [];
							}else{
								target[pro] = {};
							}
							deepClone(origin[pro],target[pro]);
						}else{
							target[pro] = origin[pro];
						}
					}
				}
				return target;
			}		

猜你喜欢

转载自blog.csdn.net/hdq1745/article/details/83338769