1、请说下你对promise的理解
答:
1、promise是异步操作的同步代码
2、promise的基本使用
通过new promise创建的一个promise对象,里面有一个参数,参数是一个回调函数,回调函数中有两个参数,resolve,rejectresolve()当异步执行成功的时候调用的方法,reject()当异步失败的时候调用的方法。
2、什么是闭包?闭包的危害?闭包使用的场景?什么是js的垃圾回收机制?
答:
1、什么是闭包:
打破了作用域链的规则
2、闭包的危害:
由于闭包会使得函数中的变量都被保存在内存当中,内存会消耗很大,所以不能够滥用闭包,否则 会造成网页性能的问题
3、闭包使用的场景:
(1)采用函数引用方式的setTimeout调用
闭包的一个通常用法是为一个在某一函数执行前先执行的函数提供参数。
(2)将函数关联到对象的实例方法
有很多这样的场景:需要分配一个函数对象的引用,以便在未来的某个时间执行该函数。那么闭包对于为这个将要执行的函数提供引用会非常有帮助,因为该函数可能直到执行时才可能够被访问。
(3)封装相关的功能集
闭包可以创建额外的scope,这可以被用来组合相关或有依赖性的代码。用这种方式可以最大限度地减少代码干扰的危害。
4、垃圾回收机制:
js具有自动垃圾回收机制,垃圾收集器会按照固定的时间间隔周期性的执行。
js中最常见的垃圾回收方式是标记清楚。
工作原理:
是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则即将其标记为“离开环境”。标记“离开环境”的就是回收内存、
3、如何将伪数组转换为数组,至少两种方式
答:(1)声明一个空数组,通过遍历伪数组把它们重新添加到新数组中。
var aLi = document.querySelectorAll('li');
var arr = [];
for( var i = 0; i<aLi.length;i++){
arr[arr.length]=aLi[i]
}
(2)使用数组的slice()方法,它返回的是数组,使用call或者apply指向伪数组
var arr = Array.prototype.slice.call(aLi)
(3)使用原型继承
aLi.___proto__ = Array.prototype;
(4)ES6中数组的新方法from()
function test(){
var arg = Array.from(argumengts);
arg.push(5);
console.log(arg);
}
teat(1,2,3,4)
(5)jq的makeArray()和toArray()方法,它返回的是数组,使用call或者apply指向伪数组
makeArray():使用了数组的push方法;
toArray():使用了数组的slice方法
4、什么是回流和重绘?什么时候会发生回流?
答:回流与重绘:
当渲染树中的一部分或者全部因为元素的尺寸、布局、隐藏等改变而需要重新构建的时候,这时候就会发生回流。
每个页面都至少发生一次回流,也就是页面第一次加载的时候。
在回流的时候,浏览器会使渲染树中受到影响的元素部分失效,并重新绘制这个部分的渲染树,完成回流以后,浏览器会重新绘制受到影响的部分元素到屏幕中,这个过程就是重绘。
什么时候会发生回流?
1、添加或者删除可见的DOM元素的时候
2、元素的位置发生改变
3、元素尺寸改变
4、内容改变
5、页面第一次渲染的时候
注:回流必定触发重绘,重绘不一定触发回流
5、什么是模块化开发?模块化开发的优点
答:
什么是模块化开发:
指文件的组织、管理、使用的方式。即把一个大的文件拆分成几个小的文件,他们之间相互引用、依赖。
模块化开发的优点:
1、模块化开发加载速度快;
2、可以做到代码重用,减少代码赘余
3、模块化开发可以整合思考,减少代码耦合。
6、浏览渲染页面的流程
答:
1、解析HTML,构建DOM
2、解析CSS,构建CSSOM
3、JS脚本加载
4、创建Render Tree树(呈现树)
5、布局(Layout)
6、绘制(Painting)
7、回流(Reflow)和重绘(Repaint)
7、ES5新增的数组方法有哪些?
答:
indexOf():返回第一次出现的下标
lastIndexOf():返回最后一次出现的下标
forEach():循环
map():映射
filter():过滤
reduce():累加器