​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 引入了 async 和 await 关键字,用于简化异步代码的编写。

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.values 和 Object.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 添加了字符串填充方法 padStart 和 padEnd。

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 添加了 flat 和 flatMap 方法,用于扁平化数组和映射数组并扁平化结果。

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 添加了 trimStart 和 trimEnd 方法,用于去除字符串开头和结尾的空白字符。

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 引入了空值合并操作符 ??,用于在左侧值为 null 或 undefined 时返回右侧值。

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 引入了 WeakRefs 和 FinalizationRegistry,用于更精细地控制垃圾回收。

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
相关文章
|
缓存
301状态码和302状态码的区别是什么?
301与302均为HTTP重定向状态码,核心区别在于:301表示资源永久迁移,浏览器会缓存新地址并更新书签,适用于域名更换、路径重构等场景;302表示临时跳转,原URL仍有效,浏览器每次请求都会验证,常用于未登录跳转或临时维护。此外,302可能将POST请求转为GET,若需保持方法不变,应使用307。
1810 2
|
定位技术
Echarts使用geojson地理坐标地图地名label标签位置不居中调整的解决方案
Echarts使用geojson地理坐标地图地名label标签位置不居中调整的解决方案
1125 0
|
11月前
|
存储 人工智能 自然语言处理
云原生视角下的企业AI全链路转型:玄晶引擎从技术、运营、营销三维度构建增量价值
玄晶引擎2026全面启航AI增量服务,依托云原生架构与AI数字员工生态平台,构建“技术-运营-营销”全链路智能协同方案。深度融合阿里云K8s、Serverless等环境,通过智能体中台、多模态模型矩阵与数据中枢,实现从算力支撑到业务增效的闭环。助力企业打破AI落地困局,迈向可持续智能转型。
1709 2
|
人工智能 文件存储 数据中心
Ollama部署本地大模型并通过Infortress APP远程访问保姆级教程
本文介绍如何快速上手本地大模型部署工具Ollama及AI远程访问工具Infortress。通过Ollama,开发者可轻松部署如Llama、Deepseek等主流开源模型,仅需几行命令即可完成安装与运行。结合Infortress,用户能实现对本地大模型的远程访问,支持多设备无缝对接,同时提供便捷的模型切换与知识库管理功能。Infortress更兼具NAS软件特性,成为个人AI数据中心的理想选择。
|
开发框架 前端开发 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游戏开发。选择框架需考虑项目需求、平台、技术栈和团队经验。
1239 3
|
缓存 前端开发 NoSQL
vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
IDEA 出现问题:严重占用CPU 长时间在90~100%解决方案
IDEA 出现问题:严重占用CPU 长时间在90~100%解决方案
5833 0
IDEA 出现问题:严重占用CPU 长时间在90~100%解决方案
|
JavaScript 测试技术
vue配置生产环境.env.production、测试环境.env.development
该文章介绍了如何在Vue项目中配置和使用不同的环境变量文件(.env、.env.production、.env.development)以适应开发、测试和生产环境,并通过修改`package.json`中的scripts来实现不同环境的打包。
4820 0
vue配置生产环境.env.production、测试环境.env.development
|
移动开发 小程序 API
uniapp组件库Popup 弹出层 的使用方法
uniapp组件库Popup 弹出层 的使用方法
1933 1
|
缓存 负载均衡 应用服务中间件
nginx(NGINX)详细下载安装及使用教程(非常适合入门)
nginx(NGINX)详细下载安装及使用教程(非常适合入门)