0814对象的深比较,对象的深复制,闭包的概念和特点,数组和链表的区别及各自优缺点,柯里化有什么作用?

0814

对象的深比较

class Box {
        _data = {
          a: 1,
          b: 2,
          c: {
            a: 2,
            b: 5,
            d: {
              a: 1,
              b: 2,
              c: [1, 2, 3],
            },
          },
        };
constructor() {}
        set data(value) {
          if(this.compareData(value, this._data))return;
          this.render();
          this._data = value;
        }
        get data() {
          return this._data;
        }
        render() {}
        compareData(target, source) {
          for (var prop in target) {
            if (typeof target[prop] === "object" && target[prop] !== null) {
              return this.compareData(target[prop], source[prop]);
            } else {
              if (target[prop] !== source[prop]) return false;
            }
          }
          return true;
        }
      }

对象的深复制

  function cloneObj(source,target){
            if(target==undefined) target={};
            var names=Object.getOwnPropertyNames(source);
            for(var i=0;i<names.length;i++){
                var desc=Object.getOwnPropertyDescriptor(source,names[i]);
                if(typeof desc.value==="object" && desc.value!==null){
                    var obj;
                   switch(true){
                       case desc.value.constructor===Date:
                       obj=new Date(desc.value.toString());
                       break;
                       case desc.value.constructor===RegExp:
                       obj=new RegExp(desc.value.source,desc.value.flags);
                       break;
                       case HTMLElement.isPrototypeOf(desc.value.constructor):
                       obj=document.createElement(desc.value.nodeName);
                       break;
                       default:
                       obj=new desc.value.constructor()
                   }
                    Object.defineProperty(target,names[i],{
                        enumerable:desc.enumerable,
                        writable:desc.writable,
                        configurable:desc.configurable,
                        value:obj
                    });
                    cloneObj(desc.value,obj);
                }else{
                    Object.defineProperty(target,names[i],desc)
                } 
            }
            return target;
        }

闭包的概念和特点

  • 概念
    • 闭包是指有权访问另一个函数作用域中的变量的函数,
      创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量
  • 特点
    • 函数嵌套函数
    • 函数内部可以引用外部的参数和变量
    • 参数和变量不会被垃圾回收机制回收

数组和链表的区别及各自优缺点

  • 主要区别

    • 数组的元素个数是固定的,而组成链表的结点个数可按需要增减

    • 数组元素的存诸单元在数组定义时分配,链表结点的存储单元在程序执行时动态向系统申请:

    • 数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系由结点所包含的指针来体现。

    • 对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多内存空间。

    • 对于元素的插人、删除操作非常频繁的列表处理场合,用数组表示列表也是不适宜的。若用链表实现,会使程序结构清晰,处理的方法也较为简便。

  • 链表的优点

    • 插入删除速度快

    • 内存利用率高,不会浪费内存

    • 大小没有固定,拓展很灵活。

  • 链表的缺点

    • 不能随机查找,必须从第一个开始遍历,查找效率低
  • 数组的优点

    • 随机访问性强
    • 查找速度快
  • 数组的缺点

    • 插入和删除效率低

    • 内存空间要求高,必须有足够的连续内存空间。

    • 可能浪费内存

    • 数组大小固定,不能动态拓展

  • 数组的特点

    • 在内存中,数组是一块连续的区域。
    • 数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。
    • 插入数据和删除数据效率低,插入数据时,这个位置后面的数据在内存中都要向后移。
    • 随机读取效率很高。因为数组是连续的,知道每一个数据的内存地址,可以直接找到给定地址的数据。
    • 不利于扩展,数组定义的空间不够时要重新定义数组。
  • 链表的特点

    • 在内存中可以存在任何地方,不要求连续。
    • 每一个数据都保存了下一个数据的内存地址,通过这个地址找到下一个数据。
    • 增加数据和删除数据很容易。
    • 查找数据时效率低,因为不具有随机访问性,所以访问某个位置的数据都要从第一个数据开始访问,然后根据第一个数据保存的下一个数据的地址找到第二个数据,
    • 不指定大小,扩展方便。链表大小不用定义,数据随意增删。

柯里化有什么作用?

  • 减少代码冗余,也能增加可读性

猜你喜欢

转载自blog.csdn.net/w_cyj/article/details/108000291