JavaScript的其他考点
脚本延迟加载的方式:
- defer属性:在js标签上添加defer属性,脚本的加载和文档的解析同步进行,等待文本解析完成之后再执行脚本,这样就不会阻塞页面的渲染。多个defer属性理论上是顺序执行的,部分浏览器可能不一样
- async属性:在js标签上添加async属性,脚本异步加载,脚本加载完毕之后会立即执行,如果文档没有解析完成可能造成阻塞。多个async脚本顺序是不确定的。
- 动态创建DOM:对文档的加载事件事件监听,当文档加载完成后,动态创建script标签引入js脚本。
不会改变原数组的方法:
concat
copyWithin
slice
位运算:
计算机的数据是通过二进制去存储的,所以某些场景下位运算计算更快,性能更高
JavaScript为什么要进行变量提升,它导致了什么问题?
JS引擎在代码执行之前会有一个解析的过程,创建了执行上下文,初始化了一些代码执行过程中需要用到的对象。当访问一个变量时,会到当前执行上下文中的作用域中取查找,而作用域的首端指向的是当前执行上下文的变量对象,这个变量对象是执行上下文的一个属性,它包含了函数的形参、所有的函数和变量声明,这个对象在代码解析的时候创建。
尾调用的好处?
尾调用指的是在函数的最后一步调用另一个函数。代码执行是基于执行栈的,所以当在一个函数里调用另一个函数时,会保留当前的执行上下文,然后再新建另外一个执行上下文加入到栈中。使用尾调用的话,因为已经是函数的最后一步,所以这时可以不必再保留当前的执行上下文,从而节省内存,这就是尾调用优化。但是ES6的尾调用优化只在严格模式下开启,正常模式是无效的。
ES6模块、CommandJS模块
use strict模式
禁止使用with语句;禁止this关键字指向全局对象;对象不能有重名的属性
判断一个对象是否属于某个类?
- 使用instanceof判断构造函数的prototype属性是否出现在对象的原型链中的任何位置
- 通过对象的constructor判断,对象的constructor指向对象的构造函数,不安全,如果constructor属性被改写
- 如果需要判断的是某个内置的引用类型,可以使用Object.prototype.toString()方法来打印一下对象的[[Class]]属性
for in和for of的区别
for of是ES6新增的遍历方式,主要这个对象有iterator接口,都可以使用for of遍历出每一项,区别:
- for of遍历获取到的是value,for in遍历获取到的是key
- for in会遍历对象整个原型链,性能差不推荐使用吧,for of不会遍历原型链
- 如果是数组遍历,for in会返回数组所有可枚举的属性,包括原型链上的,for of只返回数组的下标对应的属性值