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;
        }

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

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

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

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

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

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

  • 链表的优点

    • 插入删除速度快

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

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

  • 链表的缺点

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

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

    • 插入和删除效率低

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

    • 可能浪费内存

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

  • 数组的特点

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

    • 在内存中可以存在任何地方,不要求连续。
    • 每一个数据都保存了下一个数据的内存地址,通过这个地址找到下一个数据。
    • 增加数据和删除数据很容易。
    • 查找数据时效率低,因为不具有随机访问性,所以访问某个位置的数据都要从第一个数据开始访问,然后根据第一个数据保存的下一个数据的地址找到第二个数据,
    • 不指定大小,扩展方便。链表大小不用定义,数据随意增删。
柯里化有什么作用?
  • 减少代码冗余,也能增加可读性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值