面试题 - 前端 - ES6-ES13
ER6 新增方法
- let 和 const,解构赋值、模板字符串、箭头函数。
- Symbol、Map、Set 三种常用的数据类型。
- Proxy 重新定义了数据劫持的能力. (相对于 Object.defineProperty, Proxy 更多功能,例如可以劫持数组)。
- Reflect 定义了一套标准化的数据操作的方式。
- Promise 确实的解决了异步逻辑嵌套及回调地狱问题。定义了异步逻辑的三种状态 pending、rejected、fullfilled, 搭配 then、catch、all、race 等方法以及 async await 语法糖,大量简化了异步操作。
- Generator 函数,可以将异步逻辑划片执行(async/await 是它的语法糖)。
- 新增了 class 类的概念
- ES6 Modules
var, let, const 区别
ES6 新增了定义变量的关键字 let 和 const, 分别用于定义块级变量和常量。
var 有提前声明的特性。而 let, const 不会声明提前, 存在暂时性死区。
外部无法使用到内部的 let 和 const 定义的变量, 存在块级作用域限制。
const 定义的常量, 无法更改。
解构赋值
按照对象或者数组的结构,把对应的属性值或项提取出来。例如后端返回了一个超大的对象,而前端不需要这个对象里面的所有属性值。这时用解构赋值就使代码非常简洁。
1 | let { type, payload } = data; // {type:"",payload:""} |
模版字符串什么时候用?
在动态创建 HTML 页面,一旦涉及到换行,使用模版字符串就比用\n 方便。
箭头函数
函数类型 | 语法格式 | new 和原型 | arguments super new.target |
this 指向 | call, apply 和 bind |
---|---|---|---|---|---|
普通函数 | function() {} 函数声明 函数表达式 |
有 | 有 | 函数被调用的时候决定 谁调用就指向谁 |
修改 this 值 |
箭头函数 | () => {} 函数表达式 |
没有 可调用外围 |
没有 可调用外围 |
函数被定义的时候决定 指向上一层 |
不可修改 this 值 |
new 和原型:
1 | function Normal() {} |
arguments:
1 | function normal() { |
this 指向:
1 | let normal = { |
箭头函数是 ES6 推出的,所以在低版本浏览器是有兼容问题的,语法简介明了,逻辑更清晰。
传统的函数
箭头函数没有自己的 this,this 指向外部的 this,并且 this 会在创建的时候就绑定好.
人话:谁调用箭头函数,箭头函数的 this 就指向谁。
1 | const fn1 = function () { |
细说 this 指向
普通函数的 this 在调用的时候决定
人话:该普通函数的调用者,它是谁点出来,该普通函数的 this 就是谁。找不到就是 window 对象;构造函数的 this 就是对象本身。
独立调用的函数都归属于 window
1 | function test() { |
用对象调用
1 | let obj = { |
1 | let obj = { |
1 | let obj = { |
函数作为参数
自定义函数作参数,this 指向 window
1 | function foo() { |
setTimeout 的函数参数,this 指向 window
1 | setTimeout(function () { |
DOM 元素事件的函数参数,this 指向 DOM 元素。
1 | document.getElementById('btn').addEventListener( |
forEach 里第一个参数是一个函数,第二个参数就是 this 绑定的对象,不写默认绑定 window。
1 | const numbers = [1, 2, 3, 4]; |
箭头函数的 this 在定义的时候决定
人话:箭头函数在定义的时候,一层一层向上找,找到离自己最近的 this,就指向它。(只要有对象出现,对象里就有 this)
箭头函数独立调用的函数都归属于 window
1 | const test = () => { |
箭头函数用对象调用
1 | let obj = { |
1 | let obj = { |
用过哪些异步处理方案
- 回调函数
- Promise
- generator 生成器 yield
- async await
Promise 怎么解决回调地狱
链式回调:
1 | axios.get("1.php").then(res=>{ |
async await:
1 | async function test() { |
Promise 对象有什么好用的方法?
- Promise.all()中的 Promise 序列会全部执行通过才认为是成功,否则认为是失败;
- Promise.race()中的 Promise 序列中第一个执行完毕的是通过,则认为成功,如果第一个执行完毕的 Promise 是拒绝,则认为失败;
- Promise.any()中的 Promise 序列只要有一个执行通过,则认为成功,如果全部拒绝,则认为失败;
class 是 构造函数的语法糖
1 | class Person { |
ES6 模块化规范是什么?
人话:引入一个模块用 import … from 或者 import {某几个方法} from。导出用 export default 或者 export {某几个方法 }。
1 | import obj from './a'; |
模块化发展历史
- AMD 规范:前端 异步加载 - 提前下载, 提前加载 require.js
- CMD 规范:异步加载 - 提前下载 , 按需加载 – 玉伯 -sea.js
- CommonJs 规范:同步加载,用在 NodeJS 环境
1 | require('./b'); |
- ES6 模块化规范
CommonJs 不可以按需饮用,ES6 模块化可以。
异步遍历器生成函数(大厂面试)
Generator 函数返回一个同步遍历器,异步 Generator 函数的作用,是返回一个异步遍历器对象。在语法上,异步 Generator 函数就是 async 函数与 Generator 函数的结合。
1 | function timer(t) { |