​ES7、ES8、ES9、ES10、ES11、ES12都增加了哪些新特性?

简介: ​ES7、ES8、ES9、ES10、ES11、ES12都增加了哪些新特性?

前言


今天给大家介绍一下ES7、ES8、ES9、ES10、ES11、ES12都增加了哪些新特性?并且如何在日常开发中使用这些新特性。

ES7(ECMAScript 2016)

1. Array.prototype.includes

ES7 添加了一个新的数组方法 includes,用于检查数组中是否包含某个值。

const numbers = [1, 2, 3, 4, 5];
console.log(numbers.includes(3)); // true
console.log(numbers.includes(6)); // false

2. Exponentiation Operator

ES7 引入了指数运算符 **,用于计算基数的指数次幂。

console.log(2 ** 3); // 8
console.log(5 ** 2); // 25

ES8(ECMAScript 2017)

1. Async/Await

ES8 引入了 asyncawait 关键字,用于简化异步代码的编写。

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}
fetchData();

2. Object.values and Object.entries

ES8 添加了 Object.valuesObject.entries 方法,用于返回对象值和键值对的数组。

const obj = { a: 1, b: 2, c: 3 };
console.log(Object.values(obj)); // [1, 2, 3]
console.log(Object.entries(obj)); // [['a', 1], ['b', 2], ['c', 3]]

3. String Padding

ES8 添加了字符串填充方法 padStartpadEnd

console.log('123'.padStart(5, '0')); // '00123'
console.log('123'.padEnd(5, '0')); // '12300'

4. Object.getOwnPropertyDescriptors

ES8 引入了 Object.getOwnPropertyDescriptors 方法,用于获取对象所有属性的描述符。

const obj = { a: 1 };
const descriptors = Object.getOwnPropertyDescriptors(obj);
console.log(descriptors);
/*
{
  a: {
    value: 1,
    writable: true,
    enumerable: true,
    configurable: true
  }
}
*/

ES9(ECMAScript 2018)

1. Asynchronous Iteration

ES9 引入了异步迭代器和 for await...of 循环,用于迭代异步可迭代对象。

const asyncIterable = {
  [Symbol.asyncIterator]() {
    return {
      i: 0,
      next() {
        if (this.i < 3) {
          return Promise.resolve({ value: this.i++, done: false });
        }
        return Promise.resolve({ value: undefined, done: true });
      }
    };
  }
};
(async () => {
  for await (const num of asyncIterable) {
    console.log(num);
  }
})();

2. Rest/Spread Properties

ES9 扩展了对象的剩余(rest)和扩展(spread)属性。

const obj = { a: 1, b: 2, c: 3 };
const { a, ...rest } = obj;
console.log(a); // 1
console.log(rest); // { b: 2, c: 3 }
const newObj = { ...rest, d: 4 };
console.log(newObj); // { b: 2, c: 3, d: 4 }

3. Promise.prototype.finally

ES9 添加了 finally 方法,用于在 Promise 结束时执行代码,无论结果如何。

fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error))
  .finally(() => console.log('Fetch complete'));

ES10(ECMAScript 2019)

1. Array.prototype.flat and Array.prototype.flatMap

ES10 添加了 flatflatMap 方法,用于扁平化数组和映射数组并扁平化结果。

const arr = [1, [2, [3, [4]]]];
console.log(arr.flat(2)); // [1, 2, 3, [4]]
const arr2 = [1, 2, 3];
console.log(arr2.flatMap(x => [x, x * 2])); // [1, 2, 2, 4, 3, 6]

2. Object.fromEntries

ES10 添加了 Object.fromEntries 方法,用于将键值对数组转换为对象。

const entries = [['a', 1], ['b', 2], ['c', 3]];
const obj = Object.fromEntries(entries);
console.log(obj); // { a: 1, b: 2, c: 3 }

3. String.prototype.trimStart and String.prototype.trimEnd

ES10 添加了 trimStarttrimEnd 方法,用于去除字符串开头和结尾的空白字符。

const str = '   Hello World   ';
console.log(str.trimStart()); // 'Hello World   '
console.log(str.trimEnd()); // '   Hello World'

4. Optional Catch Binding

ES10 允许在 catch 块中省略参数。

try {
  // code that may throw an error
} catch {
  // handle the error
}

ES11(ECMAScript 2020)

1. Dynamic Import

ES11 允许动态导入模块。

import('path/to/module').then(module => {
  module.doSomething();
});

2. BigInt

ES11 引入了 BigInt,用于表示大整数。

const bigInt = 1234567890123456789012345678901234567890n;
console.log(bigInt); // 1234567890123456789012345678901234567890n

3. Nullish Coalescing Operator

ES11 引入了空值合并操作符 ??,用于在左侧值为 nullundefined 时返回右侧值。

const foo = null ?? 'default';
console.log(foo); // 'default'

4. Optional Chaining

ES11 引入了可选链操作符 ?.,用于安全地访问嵌套属性。

const user = {};
console.log(user?.profile?.name); // undefined

5. Promise.allSettled

ES11 添加了 Promise.allSettled 方法,用于等待所有 Promise 都已决议(无论成功或失败)。

const promises = [
  Promise.resolve(1),
  Promise.reject('error'),
  Promise.resolve(3)
];
Promise.allSettled(promises).then(results => {
  console.log(results);
  // [
  //   { status: 'fulfilled', value: 1 },
  //   { status: 'rejected', reason: 'error' },
  //   { status: 'fulfilled', value: 3 }
  // ]
});

ES12(ECMAScript 2021)

1. String.prototype.replaceAll

ES12 添加了 replaceAll 方法,用于替换所有匹配的子字符串。

const str = 'Hello World! Hello!';
const newStr = str.replaceAll('Hello', 'Hi');
console.log(newStr); // 'Hi World! Hi!'

2. Logical Assignment Operators

ES12 引入了逻辑赋值操作符 &&=, ||=??=

let a = true;
let b = false;
a &&= b; // a = a && b
console.log(a); // false
let c = false;
let d = true;
c ||= d; // c = c || d
console.log(c); // true
let e = null;
let f = 'default';
e ??= f; // e = e ?? f
console.log(e); // 'default'

3. WeakRefs and FinalizationRegistry

ES12 引入了 WeakRefsFinalizationRegistry,用于更精细地控制垃圾回收。

let target = {};
// 创建一个 WeakRef 对象
let wr = new WeakRef(target);
// 使用 FinalizationRegistry 注册对象的销毁回调
let registry = new FinalizationRegistry((heldValue) => {
  console.log(`${heldValue} finalized`);
});
registry.register(target, 'target');
// 销毁 target 对象
target = null;
// 通过 WeakRef 获取 target 对象
console.log(w
r.deref()); // null

4. Numeric Separators

ES12 引入了数字分隔符 _,用于提高大数字的可读性。

const largeNumber = 1_000_000_000;
console.log(largeNumber); // 1000000000
相关文章
|
6月前
|
缓存
301状态码和302状态码的区别是什么?
301与302均为HTTP重定向状态码,核心区别在于:301表示资源永久迁移,浏览器会缓存新地址并更新书签,适用于域名更换、路径重构等场景;302表示临时跳转,原URL仍有效,浏览器每次请求都会验证,常用于未登录跳转或临时维护。此外,302可能将POST请求转为GET,若需保持方法不变,应使用307。
1340 2
|
1月前
|
缓存 Linux API
OpenClaw全平台部署与Token成本控制实战:阿里云+本地三系统+千问/Coding Plan API完整指南
2026年,OpenClaw(曾用名Clawdbot)已成为主流开源AI智能体框架,凭借轻量化、跨平台、多模型兼容等优势,被广泛用于个人助手、代码开发、文档处理、自动化任务等场景。但很多用户在使用过程中面临两大痛点:一是部署流程复杂,跨系统配置容易出错;二是Token消耗失控,高频使用下成本飙升,甚至出现短时间内消耗巨额Token、产生高额费用的情况。
1264 0
|
存储 人工智能 Java
【图文详解】基于Spring AI的旅游大师应用开发、多轮对话、文件持久化、拦截器实现
【图文详解】基于Spring AI的旅游大师应用开发、多轮对话、文件持久化、拦截器实现
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
1167 159
|
安全 数据库 数据安全/隐私保护
对称加密与非对称加密的区别
对称加密与非对称加密的区别
2123 161
|
开发框架 前端开发 JavaScript
常见的移动应用开发框架有哪些?
跨平台移动开发框架概览:React Native用JavaScript构建UI;Google的Flutter打造原生体验;Ionic结合Angular与Cordova;Xamarin用C#开发iOS和Android;Apple的SwiftUI专注iOS和macOS界面;Android Jetpack提供官方工具集;Kotlin Multiplatform实现多平台共享;NativeScript用JavaScript做原生应用;Cocos2d-x则用于2D游戏开发。选择框架需考虑项目需求、平台、技术栈和团队经验。
1031 3
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
22936 31
|
人工智能 前端开发 JavaScript
前端大模型入门(二):掌握langchain的核心Runnable接口
Langchain.js 是 Langchain 框架的 JavaScript 版本,专为前端和后端 JavaScript 环境设计。最新 v0.3 版本引入了强大的 Runnable 接口,支持灵活的执行方式和异步操作,方便与不同模型和逻辑集成。本文将详细介绍 Runnable 接口,并通过实现自定义 Runnable 来帮助前端人员快速上手。
770 1
|
安全 网络协议 网络安全
怎么给ip地址配置https访问
为了配置公网IP地址的HTTPS访问,首先需明确需求并选择受信任的证书颁发机构(如JoySSL)。接着,在JoySSL官网注册并登录,填写特定注册码230922以获取免费IP证书的测试权限。提交证书申请时,填写IP地址及相关验证信息,并完成IP地址验证。验证通过后,下载证书文件。最后,使用浏览器访问IP地址,检查安全连接标志,确保无证书错误。通过以上步骤,可成功配置IP地址的HTTPS访问,提升数据传输安全性和可信度。
|
缓存 前端开发 NoSQL
vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单

热门文章

最新文章

下一篇
开通oss服务