1.谈下对Promise的理解
- Promise是用来解决回调地狱的问题的,只要要求多个异步执行的函数,必须连续顺序执行,就用Promise
用法 - 在前一个函数内返回Promise对象,Promise的参数中是个函数,有两个回调函数参数 resolve,reject
- 在正常执行后,调用resolve();就会自动执行**.then(下一个函数)**
- 在出错时,调用reject(),就会自动执行**.catch()**
ES7
- 在ES7中,使用一个匿名函数自调包裹的
(async function(){
try{
await 函数(),
await 函数()
}catch(err){
console.log(err);
}
})()
-
await是等待,所有Promise中**.then的地方都可以用await**代替,它会等待当前的异步任务执行完,再开始执行当前程序之后的代码
Promise的三个状态 -
首次调用Promise时,整个Promise对象处于pending状态
-
前一个任务执行完,自动调用resolve,之后整个Promise的状态变为resolved状态
-
当任务执行出错,自动调用reject函数,整个Promise的状态变为rejected
如果需要等待多个函数执行完,才执行
Promise.all([
函数1(),
函数2()
]).then(function(result){处理函数})//result会保存函数的返回值,形成数组
2.谈下什么是闭包
- 当想即重用变量,有保护变量不被污染时用闭包
**形成:**外层函数调用后,外层函数的作用域对象无法释放,被内层函数对象引用着
如何形成–三步: - 首先外层函数包裹受保护的变量和操作变量的内层函数
- 外层函数要返回内层函数的对象
1.return一个函数
2.或者直接将内部函数保存在一个对象的属性里面或者数组中,然后return出去
- 调用后,用外部变量接住返回的内层函数对象,形成了闭包
缺点:它比普通函数占用更多内存,容易造成内存泄漏
优点:释放闭包,将引用内层函数的外部变量赋值为null
3.谈下对原型链的理解
- 每个对象都会在其内部初始化一个Prototype属性,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,这个对象的Prototype会去找自己的prototype,就这样一直找下去,这就是原型链
4.JavaScript作用域链
- 作用域的作用是保证执行环境里面有权访问的变量和函数是有序的,作用域的变量只能向上访问,访问到window对象被终止,作用域链不允许向下访问
5.什么是数组,怎么用
- 只要储存多个数据都要用数组,便于维护和查找
- 分为索引数组和关联数组,二维数组
- 索引数组:下标都是数字的数组
- 关联数组:自定义下表名称的数组
- 二维数组:数组中的元素,又是一个子数组
怎么用创建:直接创建数组 var arr=[];或者用new创建var arr=new Array();
如果创建数组时,已经知道数组的内容,数组直接量var arr=[1,2,3],用new 创建
6.JS的基本类型
undefined,null,Boolean,Number,String
7.JS有哪些内置对象
Object是JavaScript中所有对象的父对象
数据封装类对象:Array,Object,String,boolean,Number
其他类对象
1.Arguments
2.Error 异常对象,
3.Function 函数构造器,
4.Math 数学对象
5.RegExp 正则表达式对象.
6.Date 时间对象
8.说几条JavaScript的基本规范
1.不要在同一行声明多个变量
2.在和true和false比较的时候用===或者!==,undefined和null也是用===
3.使用对象字面量替代new Array这种形式
4.不要使用全局函数,容易造成全局污染
5.For循环必须使用大括号
6.if语句必须使用大括号
9.谈谈This的对象的理解
- this总是指向函数的直接调用者
- 如果有new,指向new出来那个对象
- 但是IE的绑定事件总是指向全局对象window
10.null和undefined的区别
null代表一个对象被定义了,值为空值
undefined代表不存在这个值,没有定义
注意:在验证null时,一定要使用===,因为==无法分别null和undefined
11.JavaScript如何实现继承
1.构造原型 2.原型继承 3.实例继承 4.拷贝继承