JS浅拷贝和深拷贝

//  先创建一个对象

var person = {

  name : ' 张三 ',

  age : ' 18 ',

  children : {

    first : {

      name : ' 张小三  ',

      age : ' 5 ',

    }

    second : {

      name : ' 张小四 ',

      age : ' 6 '

    }

  }

  car : [ ' 奔驰 ' , ' 宝马 ']

 

================================================================================================================================================

//  浅拷贝

function clone ( origin , target ){

  var target = target || { }  // 判断target 有没有传值 没有的话给一个空对象

  for ( var key in origin ){

    target[key] = origin[key];

  }

  return target

}

//   前拷贝会带来的问题   比如  对象中的属性 还有对象 则拷贝出来的该属性还是一个引用了跟被拷贝的对象的地址值;该属性发生变化时,原被拷贝的对象也会跟着发生变化。

=================================================================================================================================================

//  深拷贝

function deepClone ( origin , target ) {

  var target = target || { }

  var toStr = Object.prototype.toString,  //  转化为字符串的方法

  var arrType = '[object Array]'  //  通过转化为字符串 如果是数组 则返回该值。用于判断是不是数组。

  for ( var key in origin ){

    if (origin.hasOwnProperty(key)){   //  hasOwnProperty 剔除自身以外的属性

      if ( typeof(origin[key]) === 'object' && origin[key] !== null){              //  因为null 也是对象类型 也要把null排除

        if( toStr.call( origin[key] ) === arrType ){

          target[key] = []     //   判断origin 当前属性是数组还是对象  是数组 给target 定义一个数组

        } else{

          target[key] = {}

        }

        deepClone(origin[key] , target[key] )  //   进行递归

      }else{

        target[key] = origin[key]

      }

    }

  }

  return target

}

posted @ 2020-09-28 19:01  秋苏  阅读(188)  评论(0)    收藏  举报