ES6语法总结
1.let关键字
- 作用:
- 与var类似, 用于声明一个变量。
- 特点:
- 在块作用域内有效。
- 不能重复声明。
- 不会预处理, 不存在变量提升。
- 应用:
- 循环遍历加监听。
- 使用let取代var是趋势1。
1 | |
2.const关键字
- 作用:
- 定义一个常量。
- 特点:
- 不能修改。
- 其它特点同let。
- 应用:
- 保存不用改变的数据。
1 | |
3.变量的解构赋值
- 理解:
- 从对象或数组中提取数据, 并赋值给变量(多个)
- 对象的解构赋值
- let {n, a} = {n:’tom’, a:12}
- 数组的解构赋值
- let [a,b] = [1, ‘hello’];
- 用途
- 给多个形参赋值
1 | |
4.模板字符串
- 模板字符串 : 简化字符串的拼接
- 模板字符串必须用 `` 包含(esc下面的按键)。
- 变化的部分使用${xxx}定义。
1 | |
5.简化对象写法
- 简化的对象写法
- 省略同名的属性值。
- 省略方法的function。
1 | |
6.箭头函数
- 作用: 定义匿名函数。
- 基本语法:
- 没有参数: () => console.log(‘xxxx’)
- 一个参数: i => i+2
- 大于一个参数: (i,j) => i+j
- 函数体不用大括号: 默认返回结果。
- 函数体如果有多个语句, 需要用{}包围,若有需要返回的内容,需要手动返回。
- 使用场景: 多用来定义回调函数。
- 箭头函数的特点:
- 代码简洁。
- 箭头函数没有自己的this,箭头函数的this不是调用的时候决定的,而是在定义的时候处在的对象就是它的this。
- 扩展理解:箭头函数的this看外层的是否有函数?
- 如果有,外层函数的this就是内部箭头函数的this。
- 如果没有,则this是window。
1 | |
7.三点运算符
- rest(可变)参数
- 用来取代arguments 但比arguments灵活,只能是最后部分形参参数
- 扩展运算符
- let arr1 = [1,3,5];
- let arr2 = [2,…arr1,6];
- arr2.push(…arr1);
- 备注:三点运算符实际上底层调用了数组的Symbol(Symbol.iterator)。
1 | |
8.形参默认值
1.当不传入参数的时候默认使用形参里的默认值
1 | |
9.Promise对象
- 理解:
- Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作)
- 有了promise对象, 可以将异步操作以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称’回调地狱’)
- ES6的Promise是一个构造函数, 用来生成promise实例
- 核心思想:
- 通过异步任务的执行结果去动态的修改promise对象的状态来决定调用成功或者失败的回调函数
- 使用promise基本步骤(2步):
- 创建promise对象,根据具体需求操作resolve和reject
- 调用promise的then()
- promise对象的3个状态
- pending: 初始化状态
- fullfilled: 成功状态
- rejected: 失败状态
- 应用:
- 使用promise实现超时处理
- 使用promise封装处理ajax请求
- 注意:promise对象then方法执行完有一个默认的返回值: promise对象(状态默认为成功, resolve(没有传参))!见下面的代码说明。
- 基本形式:
1 | |
- 利用promise对象执行异步任务 发送ajax请求(单纯探讨这种模式,开发中几乎不用)
1 | |
10.Symbol
- 前言:ES5中对象的属性名都是字符串,容易造成重名,污染环境。
- 概念:
- ES6中的添加了一种原始数据类型symbol(已有的原始数据类型:String, Number, boolean, null, undefined, 对象)
- 特点:
- Symbol属性对应的值是唯一的,解决命名冲突问题
- Symbol值不能与其他数据进行计算,包括同字符串拼串
- for in, for of遍历时不会遍历symbol属性。
- 使用:
- 调用Symbol函数得到symbol值
- 传参标识:
- let symbol = Symbol(‘one’);
- let symbol2 = Symbol(‘two’);
- console.log(symbol); // Symbol(‘one’)
- console.log(symbol2); // Symbol(‘two’)
- 内置Symbol值:
- 除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
- Symbol.iterator
- 对象的Symbol.iterator属性,指向该对象的默认遍历器方法。
- 备注:所以现在JS已有的数据类型有:
- 基础数据类型:String、Number、boolean、null、undefined、 Symbol。
- 引用数据类型:Object、Array、Function
1 | |
11.iterator遍历器
- 概念: iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制
- 作用:
- 为各种数据结构,提供一个统一的、简便的访问接口;
- 使得数据结构的成员能够按某种次序排列
- ES6创造了一种新的遍历命令for…of循环,Iterator接口主要供for…of消费。
- 工作原理:
- 创建一个指针对象(遍历器对象),指向数据结构的起始位置。
- 第一次调用next方法,指针自动指向数据结构的第一个成员
- 接下来不断调用next方法,指针会一直往后移动,直到指向最后一个成员
- 每调用next方法返回的是一个包含value和done的对象,{value: 当前成员的值,done: 布尔值}
- value表示当前成员的值,done对应的布尔值表示当前的数据的结构是否遍历结束。
- 当遍历结束的时候返回的value值是undefined,done值为false
- 原生具备iterator接口的数据(可用for of遍历)
- Array
- arguments
- set容器
- map容器
- String
- …
- Array可以用 for of去遍历,Object原型中没有iterator,是不可以用for of 遍历的。
- 根据遍历器的工作原理,我们模拟一个遍历器,让他既可以实现原生iterator遍历数组,又可以遍历对象,然后让它替换掉Array函数prototype中默认的遍历器,并且在Object的prototype中添加这个遍历器:
1 | |
12.Generator函数
- 概念:
- ES6提供的解决异步编程的方案之一
- Generator函数是一个状态机,内部封装了不同状态的数据,
- 用来生成遍历器对象
- 可暂停函数(惰性求值), yield可暂停,next方法可启动。每次返回的是yield后的表达式结果
- 如何定义:用* 号,例如:function* fun()
- 特点:
- function 与函数名之间有一个星号
- 内部用yield表达式来定义不同的状态
- generator函数返回的是指针对象,而不会执行函数内部逻辑
- 调用next方法函数内部逻辑开始执行,遇到yield表达式停止,返回{value: yield后的表达式结果/undefined, done: false/true}
- 再次调用next方法会从上一次停止时的yield处开始,直到最后
- yield语句返回结果通常为undefined, 当调用next方法时传参内容会作为启动时yield语句的返回值。
1 | |
- 执行图示如下图:

13. async函数(源自ES2017)
- 概念: 真正意义上去解决异步回调的问题,同步流程表达异步操作
- 本质: Generator的语法糖
- 语法:
1
2
3
4async function foo(){
await 异步操作;
await 异步操作;
} - 特点:
- 不需要像Generator去调用next方法,遇到await等待,当前的异步操作完成就往下执行
- 返回的总是Promise对象,可以用then方法进行下一步操作
- async取代Generator函数的星号*,await取代Generator的yield
- 语意上更为明确,使用简单,经临床验证,暂时没有任何副作用,哈哈
- 在解决异步回调的问题时,与promise搭配使用
- 消除“回调地狱”的最好办法是:用async和Promise实例搭配,这种方式真正意义上解决异步回调的问题,这样写的好处是:
- resolve变向通知await当前的异步任务是否成功
- 在通知的同时可以将成功额数据交给await语句的返回值
- 代码如下:
1 | |
14.类
- ES6中引入了类的概念,让JS更进一步迈向了面向对象。
- 核心关键字(同java)
- 通过class定义类/实现类的继承
- 在类中通过constructor定义构造方法
- 通过new来创建类的实例
- 通过extends来实现类的继承
- 通过super调用父类的构造方法
- 重写从父类中继承的一般方法
1 | |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 蚂蚁图书馆!
