js深拷贝

Posted liuabo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js深拷贝相关的知识,希望对你有一定的参考价值。

getType 函数获取函数类型

首先我们要实现一个getType函数对元素进行类型判断,直接调用Object.prototype.toString 方法。

 

function getType(obj){
       //tostring会返回对应不同的标签的构造函数
       const toString = Object.prototype.toString;
       const map = {
          ‘[object Boolean]‘  : ‘boolean‘, 
          ‘[object Number]‘   : ‘number‘, 
          ‘[object String]‘   : ‘string‘, 
          ‘[object Function]‘ : ‘function‘, 
          ‘[object Array]‘    : ‘array‘, 
          ‘[object Date]‘     : ‘date‘, 
          ‘[object RegExp]‘   : ‘regExp‘, 
          ‘[object Undefined]‘: ‘undefined‘,
          ‘[object Null]‘     : ‘null‘, 
          ‘[object Object]‘   : ‘object‘
      };
      if(obj instanceof Element) {
           return ‘element‘;
      }
      return map[toString.call(obj)];
   }

 

深拷贝(deepCopy)


对于一个引用类型,如果直接将它赋值给另一个变量,由于这两个引用指向同一个地址,这时改变其中任何一个引用,另一个都会受到影响。当我们想复制一个对象并且切断与这个对象的联系,就要使用深拷贝。对于一个对象来说,由于可能有多层结构,所以我们可以使用递归来解决这个问题

  

function deepCopy (data) {
  let type = getType(data),
  o;
  if (type === ‘array‘) {
    o = [];
  } else if (type === ‘object‘) {
    o = {};
  } else {
    return data;
  }
  if (type === ‘array‘) {
    for (let index = 0; index < data.length; index++) {
      const element = data[index];
      o.push(deepCopy(element));
    
    }
  } else if (type === ‘object‘){
    for (const key in data) {
      if (data.hasOwnProperty(key)) {
        const element = data[key];
        o[key] = deepCopy(element);
      }
    }
  }
  return o;
}

  

  

以上是关于js深拷贝的主要内容,如果未能解决你的问题,请参考以下文章

js 深拷贝

JS的深拷贝/浅拷贝

JS基础 - 手写深拷贝

JS手写面试题 --- 深拷贝

js对象深拷贝

JS中如何进行对象的深拷贝