js中的深度克隆和浅度克隆

浅度克隆

var obj = {age:26};
//把存在栈里的索引值复制给了obj1,指向同一份数据
var obj1 = obj;
console.log(obj1);//{age: 26}
obj.name = '张三';
//当obj的值改变时,obj1也跟着改变
console.log(obj1);//{age: 26, name: "张三"}

深度克隆

分析:

  1.判断是不是原始值 typeof

  2.判断是数组还是对象  toString

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

  4.for...in 循环 遍历

target 目标  origin  起源

function myClone(origin,target){
    //先看看target有没有值
    var target = target || {};
    // 把判断数据类型的方法赋值给变量
    var toStr = Object.prototype.toString;
    // 把判断数组的返回结果赋值给变量
    var arrStr = '[object Array]';
    // 循环遍历对象
    for(var key in origin){
         // 判断对象的属性/方法是否是自身的
         if(origin.hasOwnProperty(key)){
           // 利用typeof判断对象的返回值是否是对象,并且不为空null
           if(typeof(origin[key]) == 'object' && origin[key] !== null){
                  // 核心步骤
                  // 三元运算符
                  target[key] = toStr.call(origin[key]) == arrStr ? [] : {};
                  myClone(origin[key],target[key]);
            }else{
                  target[key] = origin[key];
            }
        }
     }
     return target;
}
var obj = {
       a:'abc',
       b:{
          b1:[1,2,3,4,5],
          b2:'xyz'
        },
        c:[9,8,7,6,5],
        d:{
           d1:function(){},
           d2:{
                dd1:'test',
                dd2:{
                     ddd1:'demo'
                }
            }
         }
 }
 var obj1 = myClone(obj);
 console.log(obj1);        
posted @ 2021-07-05 19:07  YEZI32  阅读(105)  评论(0)    收藏  举报