JavaScript 面试题
目录

JavaScript 中 ES6/ES7/ES8/ES9/ES10/ES11/ES12 新特性有哪些?

· 约 6 分钟读完 · 第 433 / 507 章

推荐答案

ES6 (ECMAScript 2015)

  • let 和 const:块级作用域变量声明。
  • 箭头函数:简化函数语法,自动绑定 this。
  • 模板字符串:支持多行字符串和嵌入表达式。
  • 解构赋值:从数组或对象中提取数据并赋值给变量。
  • 默认参数:函数参数可以设置默认值。
  • Rest 参数:将不定数量的参数表示为数组。
  • Spread 操作符:展开数组或对象。
  • 类:引入了 class 关键字,支持面向对象编程。
  • 模块化:import 和 export 支持模块化编程。
  • Promise:异步编程的解决方案。
  • Symbol:新的原始数据类型,表示唯一值。
  • 迭代器和生成器:for...of 循环和 function* 生成器。
  • Map 和 Set:新的数据结构。
  • Proxy 和 Reflect:元编程工具。

ES7 (ECMAScript 2016)

  • Array.prototype.includes:检查数组是否包含某个元素。
  • 指数操作符:** 用于指数运算。

ES8 (ECMAScript 2017)

  • async/await:简化异步代码的编写。
  • Object.values() 和 Object.entries():获取对象的值和键值对。
  • 字符串填充:padStart() 和 padEnd()。
  • Object.getOwnPropertyDescriptors():获取对象属性的描述符。

ES9 (ECMAScript 2018)

  • 异步迭代:for-await-of 循环。
  • Rest/Spread 属性:支持对象中的 Rest 和 Spread 操作。
  • Promise.prototype.finally:无论 Promise 成功或失败都会执行的回调。
  • 正则表达式改进:包括命名捕获组、反向断言等。

ES10 (ECMAScript 2019)

  • Array.prototype.flat() 和 flatMap():扁平化数组。
  • Object.fromEntries():将键值对列表转换为对象。
  • String.prototype.trimStart() 和 trimEnd():去除字符串开头或结尾的空白。
  • Symbol.prototype.description:获取 Symbol 的描述。
  • 可选的 catch 绑定:catch 块可以不带参数。

ES11 (ECMAScript 2020)

  • BigInt:支持大整数运算。
  • 动态导入:import() 动态加载模块。
  • 可选链操作符:?. 简化访问深层嵌套属性。
  • 空值合并操作符:?? 提供默认值。

ES12 (ECMAScript 2021)

  • String.prototype.replaceAll():替换字符串中所有匹配的子串。
  • Promise.any():返回第一个成功的 Promise。
  • 逻辑赋值操作符:&&=, ||=, ??=。
  • WeakRef:创建弱引用。
  • FinalizationRegistry:管理对象的终结回调。

本题详细解读

ES6 (ECMAScript 2015)

ES6 是 JavaScript 的一次重大更新,引入了许多新特性,使得 JavaScript 更加现代化和强大。let 和 const 提供了块级作用域,解决了 var 的一些问题。箭头函数简化了函数定义,并且自动绑定了 this,避免了传统函数中 this 的混乱。模板字符串使得字符串拼接更加方便,支持多行字符串和嵌入表达式。解构赋值可以轻松地从数组或对象中提取数据。默认参数和 Rest 参数使得函数定义更加灵活。Spread 操作符可以展开数组或对象,方便地进行合并或复制。类的引入使得 JavaScript 支持面向对象编程。模块化使得代码组织更加清晰。Promise 提供了更好的异步编程解决方案。Symbol 是一种新的原始数据类型,用于创建唯一值。迭代器和生成器使得遍历数据结构更加方便。Map 和 Set 提供了新的数据结构,Proxy 和 Reflect 提供了元编程的能力。

ES7 (ECMAScript 2016)

ES7 引入了 Array.prototype.includes 方法,用于检查数组是否包含某个元素,避免了使用 indexOf 的繁琐。指数操作符 ** 提供了简洁的指数运算方式。

ES8 (ECMAScript 2017)

ES8 引入了 async/await,使得异步代码的编写更加直观和简洁。Object.values() 和 Object.entries() 提供了获取对象值和键值对的便捷方法。字符串填充方法 padStart() 和 padEnd() 使得字符串格式化更加方便。Object.getOwnPropertyDescriptors() 提供了获取对象属性描述符的能力。

ES9 (ECMAScript 2018)

ES9 引入了异步迭代器,使得在异步操作中遍历数据更加方便。Rest/Spread 属性支持在对象中使用 Rest 和 Spread 操作。Promise.prototype.finally 提供了无论 Promise 成功或失败都会执行的回调。正则表达式也得到了改进,包括命名捕获组、反向断言等。

ES10 (ECMAScript 2019)

ES10 引入了 Array.prototype.flat() 和 flatMap(),使得数组扁平化更加方便。Object.fromEntries() 可以将键值对列表转换为对象。String.prototype.trimStart() 和 trimEnd() 提供了去除字符串开头或结尾空白的方法。Symbol.prototype.description 可以获取 Symbol 的描述。可选的 catch 绑定使得 catch 块可以不带参数。

ES11 (ECMAScript 2020)

ES11 引入了 BigInt,支持大整数运算。动态导入 import() 使得模块加载更加灵活。可选链操作符 ?. 简化了访问深层嵌套属性的代码。空值合并操作符 ?? 提供了更简洁的默认值设置方式。

ES12 (ECMAScript 2021)

ES12 引入了 String.prototype.replaceAll(),使得替换字符串中所有匹配的子串更加方便。Promise.any() 返回第一个成功的 Promise。逻辑赋值操作符 &&=, ||=, ??= 提供了更简洁的逻辑操作方式。WeakRef 和 FinalizationRegistry 提供了管理对象生命周期的新工具。