一起养成写作习惯!这是我参与「掘金日新计划 · 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,这自然会更快