ES6 (ES2015)

除了 IE,主流浏览器都已支持。

  • 声明:let、const
  • 块级作用域
  • 解构赋值
    • 数组、对象、字符串(转换成类数组对象)、数值和布尔值(转换成对象{toString})、函数参数
    • 可以设置默认值(当值 === undefined 时,使用默认值):const {a = 1} = {b: 2}
    • 可以自定义变量名:const {a: c} = {a: 1, b: 2}
  • 字符串扩展
    • 允许采用 \uxxxx 形式表示一个字符
    • 可使用 for…of… 遍历
    • 模板字符串``
    • 标签模板:函数调用的一种特殊形式,“标签”指的是函数,紧跟在后的模板字符串是函数的参数,例如:tagHello ${ a + b } world ${ a * b }` 等同于tag([‘Hello ‘, ‘ world ‘, ‘’], 15, 50)`
    • String.raw():返回把字符串所有变量替换且对斜杠进行转义的结果。foo${1 + 2}bar 等同于 String.raw({ raw: ['foo', 'bar'] }, 1 + 2)
    • String.fromCodePoint():返回码点对应字符。和 fromCharCode 相比可以识别大于 0xFFFF 的码点,例如 String.fromCodePoint(0x20BB7); // "𠮷"
    • codePointAt():返回字符对应码点(String.fromCodePoint()的逆操作)。例如 var s = "𠮷";s.charCodeAt(0) // 55362
    • normalize():把字符的不同表示方法统一为同样形式,返回新字符串(Unicode正规化)
    • repeat():把字符串重复n次,返回新字符串
    • matchAll():返回正则表达式在字符串的所有匹配
    • includes():是否存在指定字符串
    • startsWith():是否存在字符串头部指定字符串
    • endsWith():是否存在字符串尾部指定字符串
  • Number 扩展
    • 二进制表示法:0b或0B开头表示二进制(0bXX或0BXX),例如 0b111110111 === 503
    • 八进制表示法:0o或0O开头表示二进制(0oXX或0OXX),例如 0o767 === 503
    • Number.EPSILON:数值最小精度
    • Number.MIN_SAFE_INTEGER:最小安全数值(-2^53)
    • Number.MAX_SAFE_INTEGER:最大安全数值(2^53)
    • Number.parseInt():返回转换值的整数部分,parseInt 由全局改为绑到 Number 上
    • Number.parseFloat():返回转换值的浮点数部分,parseFloat 由全局改为绑到 Number 上
    • Number.isFinite():是否为有限数值
    • Number.isNaN():是否为NaN
    • Number.isInteger():是否为整数
    • Number.isSafeInteger():是否在数值安全范围内
    • Math.trunc():返回数值整数部分
    • Math.sign():返回数值类型(正数1、负数-1、零0)
    • Math.cbrt():返回数值立方根
    • Math.clz32():返回数值的32位无符号整数形式
    • Math.imul():返回两个数值相乘
    • Math.fround():返回数值的32位单精度浮点数形式
    • Math.hypot():返回所有数值平方和的平方根
    • Math.expm1():返回e^n - 1
    • Math.log1p():返回1 + n的自然对数(Math.log(1 + n))
    • Math.log10():返回以10为底的n的对数
    • Math.log2():返回以2为底的n的对数
    • Math.sinh():返回n的双曲正弦
    • Math.cosh():返回n的双曲余弦
    • Math.tanh():返回n的双曲正切
    • Math.asinh():返回n的反双曲正弦
    • Math.acosh():返回n的反双曲余弦
    • Math.atanh():返回n的反双曲正切
  • 对象扩展
    • 简洁表示法:对象的属性和方法({ prop, method(){} }
    • 属性名表达式:const propKey = 'name'; const a = {[propKey]: 'xxxx'}; // {name: 'xxxx'}
    • method 的 name 属性:
      • const person = {sayName() {}}; person.sayName.name; // "sayName"
      • getter/setter:const descriptor = Object.getOwnPropertyDescriptor(obj, 'foo'); descriptor.get.name // "get foo"
      • bind: const func = orignFn.bind(null); func.name; // "bound originFn"
      • Function 构造函数:(new Function()).name // "anonymous"
    • 属性的可枚举性和遍历:描述对象 descriptor 的 enumerable
    • super 关键字:指向原型对象,只能用于对象的简洁表示的方法 method 中
    • Object.is:严格比较,与 === 相比,Object.is(+0, -0); // false Object.is(NaN, NaN); // true
    • Object.assign: 浅拷贝
    • proto,Object.getPrototypeOf,Object.setPrototypeOf:返回或设置对象的原型对象(建议使用 Object.getPrototypeOf,Object.setPrototypeOf,Object.create 来返回/设置对象的原型对象)
  • 数组扩展
    • 扩展运算符:… (扩展运算符背后调用的是遍历器接口(Symbol.iterator))
    • Array.from:转换具有 Iterator 接口的数据结构为真正数组,返回新数组
      • 类数组对象:包含 length 的对象、Arguments 对象、NodeList 对象
      • 可遍历对象:String、Set 结构、Map 结构、Generator 函数
    • Array.of:将一组值转换为数组
    • copyWithin:[1, 2, 3, 4, 5].copyWithin(0, 3) // [4, 5, 3, 4, 5];从3位开始到末尾的值复制到从0开始的位置
    • find 和 findIndex:查找
    • fill:用指定值填充数组,返回原数组
    • keys、values、entries:遍历
    • 数组的空位
  • Class 类
    • 实质上是 JavaScript 现有的基于原型的继承的语法糖
    • class、extends、constructor、super、get/set、static、public fields
  • Module 模块
    • import、export
    • 编译时加载/静态加载;import/export 命令只能放在模块顶层,不能放在代码块中(例如 if 条件语句代码块中、函数中)

ES7 (ES2016)

  • 数组扩展
    • includes:数组是否包含给定的值

ES8 (ES2017)

  • 字符串扩展
    • 字符串补全长度:padStart、padEnd
  • 对象扩展
    • Object.getOwnPropertyDescriptors:返回对象所有自身属性的描述对象 descriptor
    • Object.values:返回对象所有 enumerable 属性的 value 组成的数组
    • Object.entries:返回对象所有enumerable 属性的 [key, value] 组成的数组

ES9 (ES2018)

  • 对象扩展
    • 扩展运算符:…

ES10 (ES2019)

  • 字符串扩展
    • 允许 JavaScript 字符串直接输入 U+2028(行分隔符)和 U+2029(段分隔符),例如代码 const PS = eval("'\u2029'"); 不会报错
    • JSON.stringify:如果遇到 0xD800 到 0xDFFF 之间的单个码点,或者不存在的配对形式,会返回转义字符串,JSON.stringify('\u{D834}') // ""\\uD834""JSON.stringify('\uDF06\uD834') // ""\\udf06\\ud834""
  • 对象扩展
    • Object.fromEntries:Object.entries 的逆向操作

ES11 (ES2020)

  • 数值扩展
    • BigInt
  • Module 模块
    • 添加复合写法 export * as ns from ‘mod’;
    • 动态导入 import()
      • 可在任何地方使用(运行到这句时再加载模块)
      • 与 import 语句(静态加载)不同,可以使用表达式,例如 import(../${modVar}.js)
      • 返回 Promise:import().then()