zoukankan      html  css  js  c++  java
  • 简易实现深浅拷贝的工具函数

    1. 浅拷贝思路代码:

    var poor_shallow_copy = function(source) {
      const copy = {};
      for (const prop in source) {
        // Or --> Object.prototype.hasOwnProperty.call(source, prop)
        if (source.hasOwnProperty(prop)) {
          copy[prop] = source[prop];
        }
      }
    
      return copy;
    };

    2. 深拷贝思路代码

    /**
     * 检测对象是否为 null
     */
    var is_null = o => o === null;
    
    /**
     * 检测对象是否为 函数
     */
    var is_func = o => typeof o === 'function';
    
    
    /**
     * 检测对象是否属于原始数据类型
     */
    var is_primitive_data_type = function(o) {
      const types = ['undefined', 'boolean', 'number', 'string', 'bigint', 'symbol'];
      return types.includes(typeof o) || is_null(o);
    };
    
    /**
     * 检测对象是否为引用数据类型
     */
    var is_quote_data_type = o => typeof o === 'object' && o !== null;
    
    /**
     * 深拷贝
     */
    var deep_copy = function(source, cache = new WeakMap()) {
      // 对于非引用数据类型的数据 直接返回
      if (is_primitive_data_type(source)) return source;
      // 如果是函数
      if (is_func(source)) {
        return new Function('return ' + source.toString())();
      }
      // 如果拷贝过程中发现当前对象已经出现过,直接返回缓存记录(避免循环引用)
      if (cache.has(source)) return cache.get(source);
      
      const copy = Array.isArray(source) ? [] : {};
      cache.set(source, copy);
    
      Reflect.ownKeys(source).forEach(prop => {
        if (is_quote_data_type(prop)) {
          copy[prop] = deep_copy(source[prop], cache);
        } else {
          copy[prop] = source[prop];
        }
      });
    
      return copy;
    };

    // 待完善、待细节验证

  • 相关阅读:
    SqlServer 格式化时间
    工作生活两三事
    前端面试题准备 3
    前端面试题准备 2
    MYSQL---自定义函数
    MYSQL---MD5()、PASSWORD()函数
    MYSQL---DATE_ADD()
    MYSQL---%
    MYSQL---多表删除
    MYSQL---CREATE...SELECT
  • 原文地址:https://www.cnblogs.com/fanqshun/p/15679414.html
Copyright © 2011-2022 走看看