ES6及以上新特性

ES6(ECMAScript 2015)及以上版本引入了许多新特性,每个版本都有不同的增强和改进。以下是 ES6 及以上版本的新特性的详细描述:

ES6(ECMAScript 2015):

  1. let 和 const 声明:引入块级作用域的变量声明,用于替代 var 声明,解决了变量提升的问题。
  2. 箭头函数:用 "=>" 符号定义函数,自动绑定父级上下文的 this,并且没有自己的 this。
  3. 模板字符串:使用反引号(`)定义多行字符串和字符串插值,可以在字符串中插入变量。
  4. 解构赋值:从数组或对象中提取值,赋值给变量,方便处理数据。
  5. 默认参数值:在函数定义中为参数设置默认值,简化函数的调用。
  6. 扩展运算符:用三个点(...)表示,用于将数组或对象展开成多个参数或元素。
  7. 类和继承:引入 class 和 extends 关键字,实现了更加面向对象的编程。
  8. Promise:用于处理异步操作的对象,解决了回调地狱的问题,提供了更加优雅的异步编程方式。
  9. Set 和 Map 数据结构:Set 是一种无重复值的集合,Map 是键值对的集合,提供了更多方便的数据结构。
  10. Symbol:引入了一种新的原始数据类型 Symbol,用于创建唯一的标识符。

ES7(ECMAScript 2016):

  1. Array.prototype.includes:新增了数组的 includes 方法,用于判断数组中是否包含指定的值。
  2. 指数操作符:引入了指数操作符(**),用于计算指数。

ES8(ECMAScript 2017):

  1. async/await:引入了 async 和 await 关键字,用于简化异步编程,使异步代码看起来像同步代码一样。
  2. Object.values 和 Object.entries:新增了 Object.values 和 Object.entries 方法,分别用于获取对象的值和键值对。
  3. String padding:String.prototype.padStart、String.prototype.padEnd
  4. 函数参数列表结尾允许逗号:方便使用git进行多人协作开发时修改同一个函数减少不必要的行变更。
  5. Object.getOwnPropertyDescriptors():用来获取一个对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。
const obj = {
	name: 'lxm',
	get age() { return '28' }
};
Object.getOwnPropertyDescriptors(obj)

  1. SharedArrayBuffer 对象:用来表示一个通用的,固定长度的原始二进制数据缓冲区
  2. Atomics 对象:提供了一组静态方法用来对 SharedArrayBuffer 对象进行原子操作

ES9(ECMAScript 2018):

  1. 异步迭代器:引入了异步迭代器和 for-await-of 循环,用于异步迭代数据。
//before
async function process(array) {
  for (let i of array) {
    await doSomething(i);
  }
}

async function process(array) {
  array.forEach(async i => {
    await doSomething(i);
  });
}

//after ES9
async function process(array) {
  for await (let i of array) {
    doSomething(i);
  }
}

  1. Promise.finally():无论Promise运行成功还是失败,运行相同的代码,例如清除,删除对话,关闭数据库连接等。promise.then().catch().finally(()=>console.log("finish here!"));
  2. Rest/Spread 属性:引入了对象的 Rest 和 Spread 属性,即Rest参数和扩展运算符,用于简化对象的操作。
  3. 正则表达式命名捕获组
	const reDate = /([0-9]{4})-([0-9]{2})-([0-9]{2})/,
	match  = reDate.exec('2018-04-30'),
	year   = match[1], // 2018
	month  = match[2], // 04
	day    = match[3]; // 30
	//使用符号?<name>,任何匹配失败的命名组都将返回undefined。
	const reDate = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/,
	match  = reDate.exec('2018-04-30'),
	year   = match.groups.year,  // 2018
	month  = match.groups.month, // 04
	day    = match.groups.day;   // 30

  1. 正则表达式反向断言(lookbehind)
  2. 正则表达式dotAll模式正则表达式中点.匹配除回车外的任何单字符,标记s改变这种行为,允许行终止符的出现,例如:

ES10(ECMAScript 2019):

  1. Array.prototype.flat 和 Array.prototype.flatMap:新增了数组的 flat 和 flatMap 方法,用于扁平化和映射数组。
  2. String.prototype.trimStart 和 String.prototype.trimEnd:新增了字符串的 trimStart 和 trimEnd 方法,用于去除字符串的开头和结尾空格。
  3. String.prototype.matchAll:为所有匹配的匹配对象返回一个迭代器
  4. Symbol.prototype.description:只读属性,回 Symbol 对象的可选描述的字符串。typeof a.description === "string"
  5. Object.fromEntries():返回一个给定对象自身可枚举属性的键值对数组
  6. 可选 Catch参数:从try{}catch(e){} 变为 try{}catch{}
  7. JSON Superset 超集:主要解决了JSON字符串中包含有行分隔符 (\u2028) 和段落分隔符 (\u2029) 的问题,这些字符在之前的ECMAScript中会导致解析错误。JSON.parse('"\u2028"');//""
  8. JSON.stringify() 加强格式转化,使其能够正确处理一些超出范围的Unicode字符。
  9. Array.prototype.sort() 更加稳定
  10. Function.prototype.toString() 重新修订:之前,Function.prototype.toString()只会返回了函数的主体,但没有注释和空格。现在,函数返回的结果与编写的一致:
//函数定义
function /* a comment */ foo() {}
//ES10之前
foo.toString(); // 'function foo() {}'
//ES10之后
foo.toString(); // 'function /* a comment  */ foo () {}'

ES11(ECMAScript 2020):

  1. 可选链操作符:引入了可选链操作符(?.),用于简化链式属性访问,防止出现未定义的错误。
  2. 空位合并操作符:引入了空位合并操作符(??),用于提供默认值,当值为 null 或 undefined 时使用默认值。
  3. 动态 import (): import('a').then(module => { console.info(module) });
  4. BigInt:有两种使用方式:(1)在数字字面量的后面添加后缀n;(2)使用其构造函数BigInt。支持位运算符(不支持无符号位移)、BigInt 无法直接和 Number运算、一些内置模块如 Math 也不支持 BigInt,如Math.pow(2n, 64n)、BigInt 和 Number 相等,但并不严格相等、Bigint支持和Number通过符号 > 或 < 比较大小
  5. globalThis:window(Window)、self(Worker)、global(node.js)。最开始通过const globals = (new Function('return this;'))()拿到全局对象,但 Chrome APP 内容安全策略不允许。es6-shim穷举所有可能的全局属性:
  6. Promise.allSettled:新增了 Promise.allSettled 方法,用于处理多个 Promise 对象,返回所有 Promise 的状态。
  7. for in 结构:用于规范for-in语句的遍历顺序。

ES12(ECMAScript 2021):

  1. String.prototype.replaceAll:新增了字符串的 replaceAll 方法,用于替换所有匹配的子字符串。
  2. Promise.any:新增了 Promise.any 方法,用于处理多个 Promise 对象,只要有一个完成即可。
  3. 逻辑赋值操作符 ??=、&&=、 ||=,有了这个新的标准中,逻辑表达式的操作符(&&、||、??)也可以简写了!
  4. WeakRef创建一个对象的弱引用,而不会阻止该对象被垃圾回收器回收。用构造函数来创建一个WeakRef对象ref = new WeakRef(data); 用WeakRef.prototype.deref()来取到原对象的值。 obj = ref.deref();
  5. 下划线分隔符:数字太长会导致可读性很差。使用了数字分隔符 _ (下划线),就可以让数字读的更清晰。let num = 2_3333_3333 和 let num = 233333333等价
  6. Intl.ListFormat:是一个构造函数,处理和多语言相关的对象格式化操作:
//参数属性 style:long|short; type:conjunction|disjunction
const list = ['Apple', 'Orange', 'Banana']// 会根据语言来返回相应的格式化操作
// "Apple, Orange and Banana"
new Intl.ListFormat('en-GB', { style: 'long', type: 'conjunction' }).format(list);
// "Apple、Orange或Banana"
new Intl.ListFormat('zh-cn', { style: 'short', type: 'disjunction' }).format(list);

  1. Intl.DateTimeFormat API 中的 dateStyle 和 timeStyle 的配置项 (1) dateStyle 用于指定日期的显示样式,可以设置为以下值:full | long | medium | short (2) timeStyle 用于指定时间的显示样式,可以设置为以下值:full | long | medium | short

ES13(ECMAScript 2022):

  1. Array.prototype.at:新增了数组的 at 方法,用于根据索引获取元素,支持负数索引。

以上是 ES6 及以上版本的主要新特性,每个版本都为 JavaScript 提供了更多的功能和语法糖,使得开发更加便捷和高效。随着 ECMAScript 的不断演进,未来的版本还会引入更多的新特性和改进,使得 JavaScript 成为更加强大和灵活的语言。

全部评论
牛客帖子的markdown语法存在一点问题,如果是有序列表的项当中插入了代码或者图片,那么有序列表就会中断,又从1开始排序。@牛妹
2 回复 分享
发布于 2023-08-01 16:07 美国

相关推荐

05-09 13:22
门头沟学院 Java
点赞 评论 收藏
分享
咦哟,从去年八月份开始长跑,两处实习转正都失败了,风雨飘摇,终于拿到offer了更新一下面试记录:秋招:多部门反复面试然后挂掉然后复活,具体问了啥已经忘了,只是被反复煎炸,直至焦香😋春招:base北京抖音hr打来电话说再次复活,准备面试,gogogo北京抖音一面:六道笔试题:1.promise顺序2.定义域问题3.flat展开4.并发请求5.岛屿数量算法(力扣)深度,广度都写6.忘记了,好像也是算法,难度中等其他问题多是框架底层设计,实习项目重难点~~~秒过😇北京抖音二面:三道笔试题:(为什么只有三道是因为第三道没做出来,卡住了)1.中等难度算法(忘记啥题了,应该是个数组的)2.认识js的继承本质(手写继承模式,深入js的面相对象开发)3.手写vue的响应式(卡在了watch,导致挂掉)---后知后觉是我的注册副作用函数写得有问题,有点紧张了其他题目多是项目拷打,项目亮点,对实习项目的贡献~~~第二天,挂,but立马复活转战深圳客服当天约面深圳客服一面:六道笔试题,由于面过太多次字节,面试官叫我直接写,不用讲,快些写完😋,具体都是些继承,深拷贝(注意对数组对象分开处理,深层次对象,循环引用),加中等难度算法题~~~秒过深圳客服二面:口诉八股大战:大概囊括网络,浏览器渲染原理,动画优化,时间循环,任务队列等等(你能想到的简单八股通通拉出来鞭尸😋)算法题:笔试题6道:1:找出数组内重复的数,arr[0]-arr[n]内的数大小为[1-n],例如[1,2,2,3,3]返回[2,3],要求o(n),且不使用任何额外空间(做到了o(n),空间方面欠佳,给面试官说进入下一题,做不来了)2:原滋原味的继承(所以继承真滴很重要)3:力扣股票购买时机难度中等其他滴也忘记了,因为拿到offer后鼠鼠一下子就落地了,脑子自动过滤掉可能会攻击鼠鼠的记忆😷~~~秒过深圳客服三面:项目大战参与战斗的人员有:成员1:表单封装及其底层原理,使用成本的优化,声明式表单成员2:公司内部库生命周期管理成员3:第三方库和内部库冲突如何源码断点调试并打补丁解决成员4:埋点的艺术成员5:线上项目捷报频传如何查出内鬼成员6:大文件分片的风流趣事成员7:设计模式对对碰成员8:我构建hooks应对经理的新增的小需求的故事可能项目回答的比较流利,笔试题3道,都很简单,相信大家应该都可以手拿把掐😇~~~过过过无hr面后续煎熬等待几天直接hr打电话发offer了,希望大家也可以拿到自己心仪的offer
法力无边年:牛哇,你真是准备得充分,我对你没有嫉妒,都是实打实付出
查看19道真题和解析
点赞 评论 收藏
分享
评论
7
6
分享

创作者周榜

更多
牛客网
牛客企业服务