js的知识点

101 阅读2分钟


一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,​

 两者看似没区别但实际上,Object.craete(null)创建对象非常干净,没有任何其它元素

而let obj={}展开后如下图:创建的对象是带有_proto_(前缀)的,下面有一些方法与属性,这便是js的原型链继承,它继承了Object的方法和属性。这便是区别。

如果需要对象的继承属性和方法,那就使用 let obj = {};
如果只需要一个纯净的对象,那就使用 Object.create(null)
比如说,我只需要用对象来保存一些数据,然后进行循环取用,提高循环效率。
这个时候如果对象有原型链,那便会在循环的时候去循环它的各个属性和方法
然而这不是必要的,我们只是要他里面的元素而已,前者会影响循环效率
js的apply,call,bind

  • apply和call基本类似,他们的区别只是传入的参数不同。
  • apply传入的参数是包含多个参数的数组
  • call传入的参数是若干个参数列表
  • bind方法会创建一个新的函数,当被调用的时候,将其this关键字设置为提供的值,我们必须手动去调用

Javascript的事件流模型(面试重点)

 事件冒泡:事件开始由最具体的元素接受,然后逐级向上传播

在这里插入图片描述

 事件捕捉:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的(与上面相反

 DOM事件流:三个阶段:事件捕捉,目标阶段,事件冒泡

函数防抖

当持续触发事件时,一段时间内只能触发一次。将几次操作合并为一此操作进行。比如说有一条赛车通道,赛车通过的时间为5s,5s之后到达终点,执行领奖操作

 这5s之内只允许一辆赛车在通道内,如果第一辆赛车还在通道内,此时第二辆赛车已经进来了,那么销毁第一辆赛车,从第二辆车入场重新计时5s执行领奖操作

 函数字节流

  • 当持续触发事件时,保证一定时间段内只调用一次事件处理函数。节流,顾名思义,节制流入或流出。
  • 比如说水龙头放水,一旦打开开关,水流就会很快,我们要做的就是限制流出
  • 应用场景(客运站问题)
  • 把整个事件处理器比喻成客运站,如果客运大巴到站就走,那么路上肯定会发生交通拥堵,而且车大部分是空的
  • 因为没给时间上客,虚假繁忙的情况肯定是不好的,那么怎么处理呢?
  • 设置一个时间间隔,时间间隔内只允许执行一次,客运站大巴设定一个时间,到点才会走

匿名函数(难点)

  • 顾名思义指的是没有名字的函数
  • 必须采用下面的语法,否则会报错

(function (){
//由于没有执行该匿名函数,所以不会执行匿名函数体内的语句。
console.log("666");
})

匿名自执行函数(类似于JS的单例模式) 

(function (){
    console.log("666"); // 此处会打印666
})()

 JS中的虚拟DOM是什么?(面试重点)

 为什么要有虚拟dom?

  • 文档对象模型或 DOM 定义了一个接口,该接口允许 JavaScript 之类的语言访问和操作 HTML 文档
  • 但是此接口需要付出代价,大量非常频繁的 DOM 操作会使页面速度变慢
  • 虚拟dom的出现就是为了解决操作dom的性能问题

什么是虚拟dom

       本质是对象

  • 真实节点抽象成JS对象(文档结构树)
  • 虚拟节点(VNode)表示 DOM 树中的节点。当需要操纵时,可以在虚拟 DOM的 内存中执行计算和操作,而不是在真实 DOM 上进行操纵
  • 相对于直接操作dom,这自然会更快