ES6

ES 全称 EcmaScript,是脚本语言的规范,而平时经常编写的 JavaScript,是 EcmaScript 的一种实现,

所以,ES 新特性其实指的就是 JavaScript 的新特性。        // ES 6-11,指的是 ES 的几个版本

为什么要学习新特性 ?

  • 语法简洁、功能丰富
  • 框架开发应用
  • 前端开发职位要求

EcmaScript 概述

ECMAScript 是由 Ecma 国际通过 ECMA-262 标准化的脚本程序设计语言。

ECMA( European Computer Manufacturers Association )中文名称为欧洲计算机制造商协会,这个组织的目标是评估、开发和认可电信和计算机标准。1994 年后该组织改名为 Ecma 国际。

  • Ecma 国际制定了许多标准,而 ECMA-262 只是其中的一个:

(1)ECMA-262( ECMAScript )历史版本:       // 从 ES6 开始,每年发布一个版本,版本号比年份最后一位大 1

  • 第 1  版    —    1997 年:制定了语言的基本规范
  • 第 2  版    —    1998 年:较小改动
  • 第 3  版    —    1999 年:引入正则、异常处理、格式化输出等。IE 开始支持
  • 第 4  版    —    2007 年:过于激进,未发布
  • 第 5  版    —    2009 年:引入严格模式、JSON,扩展对象、数组、原型、字符串、日期方法
  • 第 6  版    —    2015 年:模块化、面向对象语法、Promise、箭头函数、let、const、数组解构赋值等等
  • 第 7  版    —    2016 年:幂运算符、数组扩展、Async/await 关键字
  • 第 8  版    —    2017 年:Async/await、字符串扩展
  • 第 9  版    —    2018 年:对象解构赋值、正则扩展
  • 第 10 版    —    2019 年:扩展对象、数组方法
  • 第 11 版    —    2020 年:链式操作、动态导入等
  • ...

(2)谁在维护 ECMA-262

TC39( Technical Committee 39 )是推进 ECMAScript 发展的委员会。其会员都是公司( 其中主要是浏览器厂商,有苹果、谷歌、微软、因特尔等 )。TC39 定期召开会议,会议由会员公司的代表与特邀专家出席。

(3)为什么要学习 ES6

  • ES6 的版本变动内容最多,具有里程碑意义
  • ES6 加入许多新的语法特性,编程实现更简单、高效
  • ES6 是前端发展趋势,就业必备技能

(4)ES6 兼容性:http://kangax.github.io/compat-table/es6


ES6 新特性

[1] let 关键字:声明局部变量                                      // 以后声明变量,使用 let 就对了

特性:

  • 不允许重复声明

  • 块级作用域( 局部变量 )

  • 不存在变量提升

  • 不影响作用域链


[2] const 关键字:声明常量                // 通常,声明对象类型使用 const,非对象类型声明选择 let

特性:

  • 声明必须赋初始值

  • 常量的标识符一般大写( 纯属习惯 )
  • 常量的值不允许修改

  • 不允许重复声明,同 let
  • 块级作用域( 局部变量 ),同 let
  • 对于数组和对象的元素进行修改,不算做对常量的修改,不会报错( 因为地址没有发生变化 )


[3] 变量和对象的解构赋值                              // 频繁使用对象方法、数组元素,就可以使用解构赋值形式

什么是解构赋值?ES6 允许按照一定模式,从数组和对象中提取值,然后对变量进行赋值,这被称为“解构赋值”。


[4] 模板字符串:声明自带格式的字符串                           // 当遇到字符串和变量拼接的时候,可以使用模板字符串

模板字符串,是加强版的字符串,用反引号()表示,其特点为:

  • 自带格式,字符串中可用出现换行
  • 变量拼接,可用使用 ${ x } 的形式引用变量


[5] 简化对象和函数写法

ES6 允许在大括号里,直接写入变量和函数,作为对象的属性和方法,这样的写法更为简洁。


[6] 箭头函数:简化函数写法

ES6 允许使用箭头( => )来定义函数,箭头函数提供了一种更为简洁的函数书写方式,多用于匿名函数的定义。

其特点为:

  • 箭头函数不能作为构造函数实例化;
  • 不能使用 arguments;
  • 如果形参只有一个,小括号可以省略;
  • 如果函数体只有一条语句,花括号也可以省略,函数的返回值为该条语句的执行结果;

  • 箭头函数的 this 是静态的,始终指向声明时所在作用域下的 this 值;


[7] ES6 中函数参数的默认值:给函数的参数设置默认值


[8] rest 参数:获取实参( 实际上是函数的剩余参数 )                                // ES6 rest 参数


[9] 扩展运算符:将一个数组转化为用逗号分隔的参数序列

扩展运算符( ... ),好比 rest 参数的逆运算,将一个数组转化为用逗号分隔的参数序列,对数组进行解包。


[10] Symbol:表示独一无二的值                                             // Symbol 内置值的使用( 了解 )

ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是 JS 的第 7 种数据类型,一种类似于字符串的数据类型


其特点为:

  • Symbol 的值是唯一的,用来解决命名冲突的问题;

  • Symbol 的值不能与其他数据进行计算;

  • Symbol 定义的对象属性不能使用 for ... in 循环遍历,但是可以使用 Reflect.ownKeys 来获取对象的所有键名;
  • Symbol 的内置值:除了使用自己定义的 Symbol 值外,ES6 还提供了 11 个 内置的 Symbol 值,指向语言内部使用的方法,可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行

说明:Symbol 内置值的使用,都是作为某个对象类型的属性去使用


[11] 迭代器:用来遍历集合、数组等

遍历器( Iterator )就是一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。

任何数据结构只要部署 Iterator 接口,就可以完成遍历操作。


ES6 创造了一种新的遍历命令 for ... of 循环,Iterator 接口主要供 for ... of 消费;

原生具备 Iterator 接口的数据( 可以使用 for ... of 遍历 )有:

  • Array
  • Arguments
  • Set
  • Map
  • String
  • TypeArray
  • NodeList

工作原理:

  • 创建一个指针对象,指向当前数据结构的起始位置;
  • 第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员;
  • 接下来不断调用 next 方法,指针一直向后移动,直到指向最后一个成员;
  • 每调用 next 方法,返回一个包含 value 和 done 属性的对象。

应用场景:需要自定义遍历数据的时候,要想到迭代器。


[12] 生成器:一种异步编程解决方案

生成器函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完成不同。

生成器函数的参数传递:

// 代码示例:

// 代码示例:


[13] Promise:非常强大的一步编程的新解决方案

Promise 是 ES6 引入的异步编程的新解决方案。

语法上 Promise 是一个构造函数,用来封装异步操作并可以获取成功或者失败的结果。


  • Promise 构造函数: Promise (excutor) {}

代码示例:使用 Promise 封装读取文件


  • Promise.prototype.then 方法的链式调用

代码示例:


[14] Set 集合:类似数组,但元素不重复的集合

ES6 提供了一种新的数据结构 Set( 集合 ),它类似于数组,但成员的值都是唯一的( 没有重复 )。

集合实现了 Iterator 接口,因此,可以使用 “ 扩展运算符 ” 和 “ for ... of  ”。


集合的属性和方法有:

  • size 属性,返回集合的元素个数;
  • add() 方法,增加一个新元素,返回当前集合;
  • delete() 方法,删除一个元素,返回 boolean 值;
  • has() 方法,检测集合中是否包含某个元素,返回 boolean 值;
  • clear() 方法,清空集合,返回 undefined;


代码示例:


[15] Map 集合:键值对集合        —  升级版的“对象”

ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。

但是,“键”的范围并不局限于字符串,各种类型的值( 包括对象 )都可以作为键。

Map 集合也实现了 Iterator 接口,所以,可以使用 “ 扩展运算符 ” 和 “ for ... of ”。


Map 的属性和方法:

  • size 属性,返回 Map 集合的元素个数;
  • set() 方法,增加一个新元素,返回当前 Map;
  • delete() 方法,删除一个元素,返回 boolean 值;
  • get() 方法,返回键名对象对应的键值;
  • has() 方法,检测 Map 集合中是否包含某个元素,返回 boolean 值;
  • clear() 方法,清空集合,返回 undefined;


[16] Class 类:像 Java 实体类一样声明 JS 类

ES6 提供了更接近传统语言的写法,引入了 class( 类 )这个概念,作为对象的模板。

通过 class 关键字,可以定义类。

基本上,ES6 的 class 可以看作是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更加面向对象编程的语法而已。


  • static 定义静态属性和方法


  • class 类继承 & 对父类方法进行重写


  • class 中的 getter 和 setter 设置


[17] 数值扩展:增加一些数值相关的方法等

  • Number.EPSILON

Number.EPSILON 是 JavaScript 表示的最小精度;

EPSILON 属性的值接近于 2.2204460492503130808472633361816E-16;


  • 二进制和八进制:ES6 提供了二进制和八进制数值的新的写法,分别用前缀 0b 和 0o 表示。


  • Number.isFinite() 用来检查一个数值是否为有限的

  • Number.isNaN() 用来检查一个值是否为 NaN


  • Number.parseInt() 与 Number.parseFloat()

ES6 将全局方法 parseInt 和 parseFloat,移植到 Number 对象上面,使用不变;


  • Math.trunc  用于去除一个数的小数部分,返回整数部分


  • Number.isInteger()  用来判断一个数值是否为整数


[18] 对象扩展:增加一些对象相关的方法等

ES6 新增了一些 Object 对象的方法:

  • Object.is 比较两个值是否严格相等,与『===』行为基本一致(+0 与 NaN)

  • Object.assign 对象的合并,将源对象的所有可枚举属性,复制到目标对象

  • proto、setPrototypeOf、 setPrototypeOf 可以直接设置对象的原型


[19] 模块化 ?!简单来说就是,将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来


[20] Babel 对 ES6 模块化代码转换( 为了适配浏览器,将更新的 ES 规范转换为 ES5 规范 )

Babel 是一个 JavaScript 编译器,能够将新的ES规范语法转换成 ES5 的语法。

因为不是所有的浏览器都支持最新的 ES 规范,所以,一般项目中都需要使用 Babel 进行转换

步骤:使用 Babel 转换 JS 代码  —  打包成一个文件  —  使用时引入即可

安装工具:

  • babel-cli( 命令行工具 )
  • babel-preset-env( ES转换工具 )
  • browserify( 打包工具, 项目中使用的是 webpack )

  • 初始化项目

  • 安装

  • 使用 babel 转换

  • 打包

  • 在使用时引入 bundle.js


ES7 新特性

  • Array.prototype.includes  用来检测数组中是否包含某元素,返回值为布尔值,语法:arr.includes(元素值)

  • 指数运算符 ** ,即:幂运算的简化写法,例如:2的10次方:2**10


ES8 新特性

  • async 函数 +  await 表达式:异步函数

async 函数,其返回值为 promise 对象;而,promise 对象的结果由 async 函数执行的返回值决定

await 函数,await 必须写在 async 函数中;await 右侧的表达式一般为 promise 对象;await 返回的是 promise 成功的值;如果 await 的 promise 失败了,就会抛出异常,需要通过 try ... catch 捕获处理。


  • 对象方法扩展


ES9 新特性

  • 在对象中使Rest参数与spread扩展运算符

  • 正则扩展:简化和增强正则匹配

ES10 新特性

  • Object.fromEntries 将二维数组或者map转换成对象
  • trimStart 和 trimEnd 去除字符串前后的空白字符
  • Array.prototype.flat 与 flatMap 将多维数组降维
  • Symbol.prototype.description 获取Symbol的字符串描述

ES11 新特性

  • String.prototype.matchAll 用来得到正则批量匹配的结果
  • 类的私有属性:私有属性外部不可访问直接
  • Promise.allSettled 获取多个promise执行的结果集
  • 可选链操作符:简化对象存在的判断逻辑
  • 动态 import 导入:动态导入模块,什么时候使用什么时候导入
  • BigInt:大整型
  • globalThis 对象:始终指向全局对象 window