1 ES6新语法
- let const
和ES5的区别:
1.let不存在变量提升机制
2.let不允许重复声明
3.在全局作用域中基于let声明的变量不是window的一个属性
4.typeof 未声明的变量 => 不是undefined而是报错
5.let会形成块级作用域
- 解构赋值
- 拓展、剩余、展开运算符
- 箭头函数
和普通函数区别:
1.没有arguments,但是可以基于…arg获取实参集合(结果是一个数组)
2.没有自己的this,而是上下文中的this
- ES6中的模板字符串
- Promise(async/await)
- class
- interator
- Map/Set
2.请说出你对”重排(回流)和重绘读写分离“的理解!
思路:
1.首先说出什么是重排和重绘
2.突出它们消耗性能
3.突出自己注意了这些问题,以及自己的解决方案
浏览器渲染一个页面,是按照先创建DOM树->再加载CSS->生成渲染树 render tree->把渲染树交给浏览器GPU进行绘制,如果我们后期修改了元素的样式(但是没有改变大小和位置),浏览器会把当前元素重新生成渲染树,然后重新渲染,这个机制是重绘,但是一旦元素的位置或者大小等发生改变,浏览器就要从DOM树重新计算渲染,这个机制是回流,不管是重排还是重绘都非常消耗性能。
对于这个问题的解决方案
:
1、需要动态向页面追加元素的时候,基于文档碎片或者先把需要增加的所有字符拼接成字符串,最后统一进行增加
2、读写分离:把统一修改样式都放到一起执行,新版浏览器都有一个自己检测的机制,如果发现下面紧挨着的操作也是修改元素的样式,会把所有修改的事先存起来,直到遇到非修改样式的操作,会把之前存储的统一执行,引发一次回流和重绘。
3.谈谈你对面向对象的理解
【JS本身就是面向对象】
数组是Array的实例、对象是Object的实例,函数是Function的实例…再这些内置类的原型上有很多方法和属性,这些方法可以被实例调用
【面向对象中的一些语法和特点】
所谓面向对象就是基于class或者function创建一个类,执行的时候new执行创建一个实例,这样实例就可以调取类上提供的方法,想要基于面向对象进行插件封装,必须掌握关于类的继承、封装和多态。封装就是调取公共的属性和方法,JS没有严格意义的多态,不能进行方法的重写,常用的继承方式有很多,例如:原型继承、call继承、寄生组合继承、es中的继承。有些方式会存在一些问题,项目中一般基于class和extend来实现继承