ifeees / articles

“前端晚自修”公众号文章备份
3 stars 0 forks source link

javascript 深拷贝 #14

Open LoveShoneLiu opened 6 years ago

LoveShoneLiu commented 6 years ago

最简单的深拷贝方法

b = JSON.parse( JSON.stringify(a) );

如果a是最基本的数组、对象、字符串、数字、布尔型可以采用这种方法。

问题:

1、无法复制函数。

    var a = {
           'name': function() {
               alert(1);
           },
           'age': 18
       }
       var b = JSON.parse(JSON.stringify(a));
       console.log(b);    // {age: 18}

2、原型链没了

自己实现深拷贝

// 是否是dom判断
   function isDOM(item) {

       return (typeof HTMLElement === 'function') 

       ? (item instanceof HTMLElement)

       : (item && (typeof item === 'object') && (item.nodeType === 1) && (typeof item.nodeName === 'string'));

   }
   // 数据类型判断
   function getType(obj) {
       return Object.prototype.toString.call(obj).slice(8, -1);
   }
   function deepClone(item) {
       var types = [Number, String, Boolean];
       var result;

       // 如果是number/string/boolea则直接返回
       types.forEach(function(type) {
           if (item instanceof type) {
               result = type(item);
           }
       });

       // 如果不是以上三种情况,则进行进一步判断
       if (typeof result == 'undefined') {
           if (isDOM(item)) {
               result = item.cloneNode( true );
           } else if (getType(item) == 'Date') {
               result = new Date(item);
           } else if (getType(item) == 'Array') {
               result = [];
               item.forEach(function(child, index, array) {
                   result[index] = deepClone(child);
               });
           } else if (getType(item) == 'Object') {
               result = {};
               for (var name in item) {
                   result[name] = deepClone(item[name]);
               }
           } else {
               result = item;
           }
       }
       return result;

   }

使用es7实现深拷贝

var obj = {
    a: 1,
    b: {
        c: 2
    }
}
var obj2 = Object.assign({}, obj);
var obj3 = {...obj, b:{c: 4}};
obj2.b.c = 3;
console.log(obj); // {a: 1, b: {c: 2}}
console.log(obj2);// {a: 1, b: {c: 3}}
console.log(obj3);// {a: 1, b: {c: 3}}

以上内容均来自互联网