js-克隆(淺克隆 & 深克隆)


js-克隆

淺克隆

  • 淺克隆的對象的引用值是拷貝對象里的引用,這兩個對象里面的引用(如對象里的數組或者內嵌對象)指向的地方是一致的。
	var obj = {
	  name:"chen",
	  age:18,
	  gender:"female",
	  card:['visa','cb'],
	  wife:{
		name:'abc',
		son:{
		  name:'hehe'
		}
	  }
	};
	var obj1 = {

	};
	
 function clone(origin,target){
      for(var prop in origin){
        if(origin.hasOwnProperty(prop)){
          target[prop] = origin[prop];
        }
      }
      return target;
    }
    clone(obj,obj1);
	obj1.name = 'ge';
	console.log(obj1.name);//ge
	console.log(obj.name);//chen
    obj1.card.push("abc");
    console.log(obj.card);//['visa','cb','abc'];因為淺克隆的對象的引用值是拷貝對象里的引用,這兩個對象的card指向的地方是一致的。

深克隆

這兩個對象里的引用的獨立拷貝的,不指向同一個地方。
深克隆

  • 思路方法:
    1. 遍歷對象
    2. 判斷是不是原始值 typeof() object, instanceof, toString(推薦), constructor
    3. 判斷是數組還是對象
    4. 建立相應的數組或對象
    5. 遞歸
function deepClone(origin, target){
      var target = target || {};
      var toStr = Object.prototype.toString;
      var arrStr = '[object 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] = {};
            // }
            target[prop] = (toStr.call(origin[prop])==arrStr) ? [] : {};
            deepClone(origin[prop],target[prop]);
          }else{
            target[prop] = origin[prop];
          }
        }
      }
      return target;
    }
    deepClone(obj,obj1);
    obj1.card.push("abc");
    console.log(obj.card);//['visa','cb'];這兩個對象里的引用的獨立拷貝的,不指向同一個地方。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM