js面试题学习整理
1. 异步操作有哪些?
回调函数,事件监听,promise,ajax,async,setTimeout,Generator
2. Promise是什么?
Promise是异步编程的一种解决方案。
从语法上讲,promise是一个对象,通过它可以获取异步操作的消息;
从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。
promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变化。创造promise实例后,就会立即执行。
处理问题:
·回调地狱,代码难以维护,常常第一个的函数输出是第二个函数的输入这种现象;
·promise可以支持多个并发请求,获取并发请求中的数据;
·promise可以解决异步的问题,本身并不能说promise是异步的。
Promise是一个构造函数,自身有all,reject,resolve这几个方法,原型上有then,catch等方法。
Promise的构造函数接收一个参数:函数,并且这个函数需要传入两个参数:
resolve: 异步操作执行成功后的回调函数。
reject:异步操作执行失败后的回调函数。
then: 传递状态的方式来使得回调函数能够及时被调用。
catch: 指定reject的回调,或者在执行resolve时,如果抛出异常,并不会报错卡死js,而是会进到这个catch方法中。
all: 谁跑得慢,以谁为准执行回调。all接受一个数组参数,里面的值最终都会返回Promise对象。提供了并行执行异步操作的能力,并且在所有异步操作执行完成后才执行回调。
race: 谁跑的快,以谁为准执行回调。
3. forEach(),map(),filter()的区别:
forEach():
· 遍历数组,调用数组的每个元素,利用回调函数对数组进行操作,本质上等同于for循环;
· forEach会改变原数组。没有返回值;
· 不支持 continue 和 break;
· return只能跳出当前循环。
map():
· 遍历数组,调用数组的每个元素,利用回调函数对数组进行操作,与forEach类似;
· map是返回一个新数组,原数组不变,新数组的索引结构和原数组一致;
· map需要return返回值。
filter():
· 遍历数组,返回一个新数组(原数组的子集),回调函数用于逻辑判断;
· 回调函数为 true 则将当前元素添加到新数组中,false则跳过;
·不会改变原数组。
4. 事件委托/事件代理:
· 利用冒泡机制,将子元素的事件委托给父元素去监听(给父元素添加事件),当子元素触发事件时,事件冒泡到父级。如果希望指定的子元素才能触发事件,可以通过事件对象(event)获得事件源(target),然后通过条件判断是不是期望的子元素,如果是的话,执行事件,否则不执行事件。
· 事件委托的好处:
1.实现对未来元素事件的绑定;
2.减少事件绑定,提高性能。