对象深拷贝

85 阅读1分钟

 对象深拷贝(让拷贝的对象与原对象不是同一引用)

  • 如果内部没有引用数据或者时间正则null等等数据时
  var obj = {  name: "karen"}
  var str = JSON.stringify(obj) //'{"name":"karen"}' 
  var obj2 = JSON.parse(str) //{name:"karen"}  
  console.log(obj2, obj == obj2) //{name:"karen"}  false 

image.png

  • 什么数据都有,常常笔试题经常出现 (1)方法1. 最简单的方式,缺陷是原型链没有拷贝 函数和null不会拷贝
var copy1 = function (obj) {
    return JSON.parse(JSON.stringify(obj));
}
var a = {a:function(){console.log('hello world')},b:{c:1},c:[1,2,3],d:"wanger",
e:new Date(),f:null,g:undefined}
var b = copy1(a)

(2)方法2.利用自调用

  var copy1 = function (obj) {
    if (obj === null) return null
    if (typeof obj !== 'object') return obj;
    if (obj.constructor === Date) return new Date(obj);
    if (obj.constructor === RegExp) return new RegExp(obj);
    var newObj = new obj.constructor(); //保持继承链
    for (var key in obj) {
      if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性
        var val = obj[key];
        newObj[key] = typeof val === 'object' ? arguments.callee(val) : val;
        // 使用arguments.callee解除与函数名的耦合
      }
    }
    return newObj;
  };