(一)let 与 const
ES6新增了两个js关键字:let和const
1.let
特点:
1-1:let 声明的变量只在 let 命令所在的代码块内有效
1-2:不能重复声明
1-3:不存在变量提升
2.const
特点:
2-1:const 声明一个只读的常量,一旦声明,常量的值就不能改变
2-2:使用 const 声明复杂类型对象时要慎重
(二)解构赋值
解构赋值是对赋值运算符的扩展。
他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取
(三)Symbol
ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。
(四)Map 与 Set
1.Map
Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
Maps 和 Objects 的区别
- 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
- Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
- Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
- Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
2.Set
Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
Set 中的特殊值
Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
- +0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
- undefined 与 undefined 是恒等的,所以不重复;
- NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。
- 伪数组,如果需要转成真数组配合Array.from()来使用
(五)Reflect 与 Proxy
1.Proxy
Proxy 与 Reflect 是 ES6 为了操作对象引入的 API 。
Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。
2.Reflect
Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。
ES6 中将 Object 的一些明显属于语言内部的方法移植到了 Reflect 对象上(当前某些方法会同时存在于 Object 和 Reflect 对象上),未来的新方法会只部署在 Reflect 对象上。
Reflect 对象对某些方法的返回结果进行了修改,使其更合理。
Reflect 对象使用函数的方式实现了 Object 的命令式操作。
(六)字符串
1.模板字符串
模板字符串相当于加强版的字符串,用反引号 `,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。用法:``+${}
2.includes
返回布尔值,判断是否找到参数字符串。
3.startsWith
返回布尔值,判断参数字符串是否在原字符串的头部。
4.endsWith
返回布尔值,判断参数字符串是否在原字符串的尾部。
5.repeat
返回新的字符串,表示将字符串重复指定次数返回
6.padStart
返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
7.padEnd
返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。
(七)对象
1.属性的简洁表示法
ES6允许对象的属性直接写变量,这时候属性名是变量名,属性值是变量值。(方法名也可以简写)
2.属性名表达式
ES6允许用表达式作为属性名,但是一定要将表达式放在方括号内。
3.对象的拓展运算符
拓展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象,可用于合并两个对象
4.对象的新方法
4-1:Object.assign(target, source_1, ···)
用于将源对象的所有可枚举属性复制到目标对象中,第一个参数是目标对象,后面的参数是源对象,assign 的属性拷贝是浅拷贝
4-2:Object.is(value1, value2)
用来比较两个值是否严格相等,与(===)基本类似。
(八)数组
1.Array.of()
将参数中所有值作为元素形成数组
2.Array.from()
将类数组对象或可迭代对象转化为数组
3.find()
查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素
4.findIndex()
查找数组中符合条件的元素索引,若有多个符合条件的元素,则返回第一个元素索引
5.fill()
将一定范围索引的数组元素内容填充为单个指定的值
6.copyWithin()
将一定范围索引的数组元素修改为此数组另一指定范围索引的元素
7.遍历
7-1:entries()
遍历键值对
7-2:keys()
遍历键名
7-3:values()
遍历键值
(九)函数
默认参数
不定参数
箭头函数
(十)Class 类
在ES6中,class (类)作为对象的模板被引入,可以通过 class 关键字定义类。
class 的本质是 function。
它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。
(十一)模块
在 ES6 前, 实现模块化使用的是 RequireJS 或者 seaJS(分别是基于 AMD 规范的模块化库, 和基于 CMD 规范的模块化库)。
ES6 引入了模块化,其设计思想是在编译时就能确定模块的依赖关系,以及输入和输出的变量。
ES6 的模块化分为导出(export) @与导入(import)两个模块。
特点
ES6 的模块自动开启严格模式,不管你有没有在模块头部加上 use strict;。
模块中可以导入和导出各种类型的变量,如函数,对象,字符串,数字,布尔值,类等。
每个模块都有自己的上下文,每一个模块内声明的变量都是局部变量,不会污染全局作用域。
每一个模块只加载一次(是单例的), 若再去加载同目录下同文件,直接从内存中读取。
(十二)Promise 对象
是异步编程的一种解决方案。
从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
Promise 状态
状态的特点
Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。
Promise 对象只有:从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型)。
状态的缺点
无法取消 Promise ,一旦新建它就会立即执行,无法中途取消。
如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
then 方法
then 方法接收两个函数作为参数,第一个参数是 Promise 执行成功时的回调,第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用。
常见方法(.then,.catch,.resolve,.reject,.finally,.all,.any,.done,.race,.allSettled)
(十三)Generator 函数
ES6 新引入了 Generator 函数,可以通过 yield 关键字,把函数的执行流挂起,为改变执行流程提供了可能,从而为异步编程提供解决方案。 基本用法
Generator 函数组成
Generator 有两个区分于普通函数的部分:
-
一是在 function 后面,函数名之前有个 * ;
-
函数内部有 yield 表达式。
其中 * 用来表示函数为 Generator 函数,yield 用来定义函数内部的状态。