# ES6-ES13新特性

# ES6(ECMAScript 2015)

ES6 正式支持了类、模块、迭代器、生成器、箭头函数、Promise、反射、代理和众多新的数据类型

  • let 和 const
  • 解构赋值
  • 模板字符串
  • 函数参数默认值和箭头函数
  • 扩展运算符
  • 对象的属性简写
  • super 关键字
  • Symbol 变量
  • Set 和 Map 数据
  • 代理和反射
  • 迭代器
  • Promise
  • class 类
  • Module 模块

es6 (opens new window)

# ES7(ECMAScript 2016)

ECMAScript 2016 中添加了以下功能:

  • Array.prototype.includes() 检查数组是否包含给定值。
  • 求幂运算符 (**): 4 ** 2 => 16

# es8(ECMAScript 2017)

ECMAScript 2017 中添加了以下功能:

  • 异步函数(async/await)让我们使用看起来像同步的语法来编写异步代码。
  • Object.values() 返回一个数组,其中包含给定对象的所有可枚举字符串键属性的值。
  • Object.entries() 返回一个数组,其中包含给定对象的所有可枚举字符串键属性的键值对。每对都被编码为一个二元素数组。
  • 字符串填充:字符串方法 String.padStart()String.padEnd() 插入填充文本,直到接收者足够长:
    '7'.padStart(3, '0'); // '007'
    'yes'.padEnd(6, '!'); // 'yes!!!'
    
    1
    2
  • 函数参数列表和调用中的尾随逗号:自 ES3 以来,数组文字和自 ES5 以来的对象文字中都允许使用尾随逗号。它们现在也允许在函数调用和方法调用中使用。
  • Object.getOwnPropertyDescriptors()
  • 共享内存和原子 (见提案 (opens new window))

# ES9(ECMAScript 2018)

ECMAScript 2018 中添加了以下功能:

  • 异步迭代是同步迭代的异步版本。它基于 Promise:
    • 使用同步迭代,我们可以立即访问每个项目。使用异步迭代,我们必须 await 在访问项目之前。
    • 对于同步迭代,我们使用 for-of 循环。对于异步迭代,我们使用 for-await-of 循环。
  • 传播到对象文字中:通过在对象文字中使用传播(...),我们可以将另一个对象的属性复制到当前对象中。一个用例是创建对象的浅拷贝obj:
    const shallowCopy = {...obj};
    
    1
  • 解构属性:当对象解构一个值时,我们现在可以使用解构语法(...)来获取一个对象中所有以前未提及的属性。
    const {a, ...remaining} = {a: 1, b: 2, c: 3};
    assert.deepEqual(remaining, {b: 2, c: 3});
    
    1
    2
  • Promise.prototype.finally() 与 finally try-catch-finally 语句的子句相关——类似于 Promise 方法如何.then() 与 try 子句 .catch() 相关并与 catch 子句相关。 换句话说:.finally() 无论 Promise 是否被履行或拒绝,都会执行回调。
  • 新的正则表达式功能
  • 模板文字修订 允许在标记模板中带有反斜杠的文本在字符串文字中是非法的

# ES10(ECMAScript 2019)

ECMAScript 2019 中添加了以下功能:

  • Array.prototype.flatMap() 工作方式类似.map(),但让回调返回零个或多个值的数组,而不是单个值。然后将返回的数组连接起来并成为 .flatMap() 用例包括:
    • 同时过滤和映射
    • 将单个输入值映射到多个输出值
  • Array.prototype.flat() 将嵌套数组转换为平面数组。或者,我们可以告诉它应该在哪个嵌套深度停止展平。
  • Object.fromEntries() 从可迭代的条目创建一个对象。每个条目都是一个包含属性键和属性值的二元素数组。
  • 字符串方法.trimStart() 工作方式 .trimEnd() 类似 .trim(),但仅在字符串的开头或结尾删除空格。
  • 可选catch:如果我们不使用它,我们现在可以省略子句的参数。
  • Symbol.prototype.description 是读取符号的描述。以前,描述包含在结果中,.toString() 但无法单独访问。
  • JSON 超集
  • 格式良好JSON.stringify()
  • Function.prototype.toString()修订

# ES11(ECMAScript 2020)

ECMAScript 2020 中添加了以下功能:

  • 新模块功能

    • 动态导入 import():正常的 import 语句是静态的:我们只能在模块的顶层使用它,它的模块说明符是一个固定的字符串。import() 改变了这一点。它可以在任何地方使用(包括条件语句),我们可以计算它的参数。
    • import.meta 包含当前模块的元数据。它的第一个广泛支持的属性是 import.meta.url 包含一个带有当前模块文件 URL 的字符串。
    • 命名空间重新导出:以下表达式导入'mod'命名空间对象中模块的所有导出ns并导出该对象。
      `export * as ns from 'mod';`
      
      1
  • 属性访问和方法调用的可选链接。可选链接的一个示例是:

    `value.?prop`
    
    1

    此表达式的计算结果为 undefined。否则,它的计算结果为value.prop。当某些属性可能丢失时,此功能在属性读取链中特别有用。

  • 空值合并运算符 (??)

    value ?? defaultValue
    
    1

    该运算符允许我们在缺少某些内容时使用默认值。 以前在这种情况下使用了逻辑或运算符 (||),但它在这里有缺点,因为只要左侧是假的(这并不总是正确的),它就会返回默认值。

  • Bigints – 任意精度整数:Bigints 是一种新的原始类型。它支持可以任意大的整数(它们的存储会根据需要增长)。

  • String.prototype.matchAll()/g:如果未设置标志,则此方法抛出,并返回一个包含给定字符串的所有匹配对象的可迭代对象。

  • Promise.allSettled() 接收一个可迭代的 Promises。它返回一个 Promise,一旦所有输入的 Promise 都被解决,该 Promise 就会实现。实现值是一个数组,每个输入 Promise 有一个对象——以下之一:

    • { status: 'fulfilled', value: «fulfillment value» }
    • { status: 'rejected', reason: «rejection value» }
  • globalThis 提供了一种访问全局对象的方法,该对象可在浏览器和服务器端平台(如 Node.js 和 Deno)上运行。

  • for-in: 在 JavaScript 中部分指定对象枚举顺序

# ES12(ECMAScript 2021)

ECMAScript 2021 中添加了以下功能:

  • String.prototype.replaceAll() 让我们替换正则表达式或字符串的所有匹配项(.replace()仅替换第一次出现的字符串):
    'abbbaab'.replaceAll('b', 'x');
    // 'axxxaax'
    
    1
    2
  • Promise.any() 和 AggregateError:Promise.any() 返回一个 Promise,一旦 Promise 的可迭代中的第一个 Promise 完成,它就会完成。如果只有拒绝,则将它们放入 AggregateError 成为拒绝值的其中。 Promise.any() 只对几个中第一个实现的 Promise 感兴趣时使用。
  • 逻辑赋值运算符
    a ||= b;
    a &&= b;
    a ??= b;
    
    1
    2
    3
  • 下划线 ( _) 作为分隔符
    • 数字文字:123_456.789_012
    • Bigint 字面量:6_000_000_000_000_000_000_000_000n WeakRefs

# ES13(ECMAScript 2022)

ES2022 可能会在 2022 年 6 月成为标准。以下提案已进入第 4 阶段,并计划成为该标准的一部分:

  • 班级新成员
    • 现在可以通过以下方式创建属性(公共插槽):
      • 实例公共字段
      • 静态公共字段
    • 私有插槽是新的,可以通过以下方式创建:
      • 私有字段(实例私有字段和静态私有字段)
      • 私有方法和访问器(非静态和静态)
    • 静态初始化块
  • 私有插槽检查:以下表达式检查是否obj有私有插槽#privateSlot:
    #privateSlot in obj
    
    1
  • 模块中的顶层 await:我们现在可以在模块 await 的顶层使用,而不必再输入异步函数或方法。
  • error.cause:Error 及其子类现在让我们指定哪个错误导致了当前错误:
    new Error('Something went wrong', {cause: otherError});
    
    1
  • .at() 可索引值的方法让我们可以读取给定索引处的元素(如括号运算符[])并支持负索引(与括号运算符不同)。
    ['a', 'b', 'c'].at(0);
    // 'a'
    ['a', 'b', 'c'].at(-1);
    // 'c'
    
    1
    2
    3
    4
    以下“可索引”类型具有方法.at():
    • string
    • Array
    • 所有类型化数组类:Uint8Array 等。
  • RegExp 匹配索引:如果我们向正则表达式添加一个标志,使用它会生成匹配对象,记录每个组捕获的开始和结束索引。
  • Object.hasOwn(obj, propKey) 提供了一种安全的方法来检查对象 obj 是否具有带有 key 的自己的属性 propKey。与相比 Object.prototype.hasOwnProperty,它适用于所有对象。
上次更新: 5/10/2022, 10:31:54 PM