- 内联元素浮动会变成内联块级元素
- const(ES6)声明的变量,如果是对象,就不能更改,但对象的属性可以更改,原因是存储在const声明的变量里是指向真正存储对象所在地方的指针,指针不能更改,但指针指向的对象可以更改。
- 回调函数:英文名callback,即先不调用、等满足一定条件后再调用的函数。
- var有变量声明提升(注意变量的初始化部分并不会提升)
- Promise对象代表一个异步操作的最终结果,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。Promise是一个构造函数,用来生成Promise对象。Promise 新建后就会立即执行。Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。then()有两个参数,都是回调函数。第一个回调函数,在Promise 状态为resolved(这里的resolved指fulfilled) 时执行,第二个在状态为rejected时执行。catch方法,相当于then(null,reject)的一个变体。then和catch都会返回一个新的Promise对象。then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行。then里不能指定resolve和reject。Promise 对象的错误会一直向后传递,直到被捕获为止,捕获并执行完catch后,后面的then还会接着执行(如果没报错则直接跳过catch去执行后面的then)。一般来说,不要在then方法里面定义 reject 状态的回调函数(即then的第二个参数),总是使用catch方法。
Promise.resolve方法允许调用时不带参数,直接返回一个resolved状态的 Promise 对象。立即resolve的 Promise 对象,是在本轮“事件循环”(event loop)的结束时,而不是在下一轮“事件循环”的开始时。比如,setTimeout(fn, 0)在下一轮“事件循环”开始时执行,Promise.resolve()在本轮“事件循环”结束时执行,console.log('one')则是立即执行。
- Promise的优点(作用)和缺点?
优点:
1) 将异步操作以同步操作的流程表达出来,避免了写层层嵌套的回调函数
2) Promise对象提供了统一的接口,使得控制异步操作更加容易。
缺点:
1) 无法取消
2) 当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
- 宏任务和微任务?
宏任务:script(全局任务/JS主代码块)、定时器(setTiemout和setInterval)、I/O、渲染等
微任务:Promise、MutationObserver(突变观察者)
当执行栈空了的时候,先执行一个宏任务,然后执行全部的微任务;宏任务和微任务的区别就是执行顺序的不同。
- 事件循环?
1) 所有同步任务都在主线程上执行(这个主线程就是JS线程),形成一个执行栈
2) 主线程之外,还存在一个任务队列,当异步任务有了结果,就在任务队列里放置一个任务(每一个任务都有一个与之关联的用于处理这条任务的函数)
3) 一旦执行栈(主线程)中的所有同步任务执行完毕,任务队列中的任务就进入执行栈(主线程)执行(优先级:Promise>DOM事件>定时器)
4) 主线程不断重复上述步骤,这就是事件循环
PS:
1) 浏览器多线程,JS线程是其中的一个,此外还有渲染线程、定时器线程、DOM事件线程、HTTP请求线程
2) 渲染线程和JS线程是互斥的,所以下载、解析、执行JS会阻塞页面渲染(