一、请说下你对promise的理解
答:
一、promise是异步操做的同步代码
二、promise的基本使用
经过new promise建立的一个promise对象,里面有一个参数,参数是一个回调函数,回调函数中有两个参数,resolve,rejectresolve()当异步执行成功的时候调用的方法,reject()当异步失败的时候调用的方法。
二、什么是闭包?闭包的危害?闭包使用的场景?什么是js的垃圾回收机制?
答:
一、什么是闭包:
打破了做用域链的规则
二、闭包的危害:
因为闭包会使得函数中的变量都被保存在内存当中,内存会消耗很大,因此不可以滥用闭包,不然 会形成网页性能的问题
三、闭包使用的场景:
(1)采用函数引用方式的setTimeout调用
闭包的一个一般用法是为一个在某一函数执行前先执行的函数提供参数。
(2)将函数关联到对象的实例方法
有不少这样的场景:须要分配一个函数对象的引用,以便在将来的某个时间执行该函数。那么闭包对于为这个将要执行的函数提供引用会很是有帮助,由于该函数可能直到执行时才可可以被访问。
(3)封装相关的功能集
闭包能够建立额外的scope,这能够被用来组合相关或有依赖性的代码。用这种方式能够最大限度地减小代码干扰的危害。
四、垃圾回收机制:
js具备自动垃圾回收机制,垃圾收集器会按照固定的时间间隔周期性的执行。
js中最多见的垃圾回收方式是标记清楚。
工做原理:
是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则即将其标记为“离开环境”。标记“离开环境”的就是回收内存、
三、如何将伪数组转换为数组,至少两种方式
答:(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方法
四、什么是回流和重绘?何时会发生回流?
答:回流与重绘:
当渲染树中的一部分或者所有由于元素的尺寸、布局、隐藏等改变而须要从新构建的时候,这时候就会发生回流。
每一个页面都至少发生一次回流,也就是页面第一次加载的时候。
在回流的时候,浏览器会使渲染树中受到影响的元素部分失效,并从新绘制这个部分的渲染树,完成回流之后,浏览器会从新绘制受到影响的部分元素到屏幕中,这个过程就是重绘。
何时会发生回流?
一、添加或者删除可见的DOM元素的时候
二、元素的位置发生改变
三、元素尺寸改变
四、内容改变
五、页面第一次渲染的时候
注:回流一定触发重绘,重绘不必定触发回流
五、什么是模块化开发?模块化开发的优势
答:
什么是模块化开发:
指文件的组织、管理、使用的方式。即把一个大的文件拆分红几个小的文件,他们之间相互引用、依赖。
模块化开发的优势:
一、模块化开发加载速度快;
二、能够作到代码重用,减小代码赘余
三、模块化开发能够整合思考,减小代码耦合。
六、浏览渲染页面的流程
答:
一、解析HTML,构建DOM
二、解析CSS,构建CSSOM
三、JS脚本加载
四、建立Render Tree树(呈现树)
五、布局(Layout)
六、绘制(Painting)
七、回流(Reflow)和重绘(Repaint)
七、ES5新增的数组方法有哪些?
答:
indexOf():返回第一次出现的下标
lastIndexOf():返回最后一次出现的下标
forEach():循环
map():映射
filter():过滤
reduce():累加器
数组