ECMAScript(16、17、18、19)新特性

Array.prototype.includes

  • includes 是数组上的简单实例方法,可以轻松查找到数组中是否包含指定内容(包括NaN)
  • 返回布尔值
    const arr = [1, 2, 3, 4, 5, NaN]
if (arr.indexOf(3) >= 0) {
console.log(true)
}
if (arr.includes(3)) {
console.log(true)
} arr.includes(NaN) // true
arr.indexOf(NaN) // -1

Object.values()

  • Object.values()是类似于Object.Keys()的新函数,但返回对象自身属性的所有值,不包括原型链中的任何值
    const cars = { BMW: 3, Tesla: 2, Toyota: 1 }
const vals = Object.keys(cars).map(key => cars[key])
console.log(vals) // [3, 2, 1] const values = Object.values(cars)
console.log(values) // [3, 2, 1]

Object.entries()

  • Object.entries()Object.keys 类似,但它不是仅返回键,而是以数组方式返回键和值, 这使得在循环中使用对象或将对象转换为映射等操作变得非常简单.
    const cars = { BMW: 3, Tesla: 2, Toyota: 1 }

    Object.keys(cars).forEach(key => {
console.log('key: ' + key + ' value: ' + cars[key])
}) for(let [key, value] of Object.entries(cars)) {
console.log(`key: ${key} value: ${value}`)
}
    const cars = { BMW: 3, Tesla: 2, Toyota: 1 }

    const map1 = new Map()
Object.keys(cars).forEach(key => {
map1.set(key,cars[key])
}) const map = new Map(Object.entries(cars)) // map {BMW: 3, Tesla: 2, Toyota: 1}

异步迭代(Asynchronous Iteration)

  • 这是一个及其好用的新特性,让我们能够非常容易的创建异步循环代码
    const promise = [
new Promise(resolve => resolve(1)),
new Promise(resolve => resolve(2)),
new Promise(resolve => resolve(3)),
] // 使用 for-of 遍历不会等待每一个Promise resolve
async test1() => {
for(const obj of promise) {
console.log(obj) // promise promise promise
}
} // 使用 for-await-of 遍历会等待每一个Promise resolve之后,进入下次循环
async test2() => {
for await (const obj of promise) {
console.log(obj) // 1, 2, 3
}
} test1()
test2()

Object.fromEntries()

  • 在JavaScript中,将数据从一种格式转换为另一种格式非常常见,为了便于将对象转换为数组,ES2017引入了Object.entries()方法. 此方法将对象作为参数,并以[key,value]的形式返回对象自己可枚举字符串键控属性对的数组
    const obj = {one: 1, two: 2, three: 3};
console.log(Object.entries(obj));
// [["one", 1], ["two", 2], ["three", 3]]
  • 如果我想要做相反的事情并将键值对列表转换为对象呢? ES2019引入Object.fromEntries()方法,此静态方法允许你轻松的将键值对列表转换为对象
    const myArray = [['one', 1], ['two', 2], ['three', 3],]
const obj = Object.fromEntries(myArray)
console.log(obj) // {'one': 1, 'two': 2, 'three': 3,}

PS: 传递给Object.fromEntries()的参数可以是实现迭代协议的任何对象,只要它返回一个两元素,类似于数组的对象即可

例如: Object.fromEntries()将Map对象作为参数,并创建一个新对象,其键和对应值有Map中的对给出:

    const map = new Map()
map.set('one', 1)
map.set('two', 2)
map.set('three', 3)
const obj = Object.fromEntries(map)
console.log(obj)
  • 使用Object.fromEntries()的另一种情况是处理URL的查询字符串
    const paramsString = 'param1=foo&param2=baz'
const searchParams = new URLSearchParams(paramsString)
Object.fromEntries(searchParams)

此代码中,查询字符串将传递给URLSearchParams()构造函数,然后将返回值(即URLSearchParams对象实例)传递给Object.fromEntries()方法,结果是一个包含每个参数作为属性的对象

trimStart() and trimEnd()

  • trimStart()trimEnd()方法再实现与trimLefttrimRight相同
    const str = "  string  "
// ES2019
console.log(str.trimStart()) // "string "
console.log(str.trimEnd()) // " string"

flat() and flatMap()

  • flat()方法可以将多维数组展平一维数组
    const arr = ['a', 'b', 'c', ['d', 'e',]]
const flattened = arr.flat()
console.log(flattened)
  • 以前经常使用的是reduce()或者concat()来展平多维数组
    const arr = ['a', 'b', 'c', ['d', 'e',]]
const flattened1 = [].concat.apply([], arr)
// 或者
const flattened2 = [].concat(...arr)
  • 数组存在空值展平时将被丢弃
    const arr = ['a', '', '', 'b', ['c', 'd']]
const fattened = arr.flat()
console.log(fattened)
  • flat()还接受一个可选参数,该参数指定嵌套数组应该被展平的级别数,如果未提供参数,则将使用默认值1
    const arr = [10, [20, [30]]]
console.log(arr.flat()) // [10, 20, [30]]
console.log(arr.flat(1)) // [10, 20, [30]]
console.log(arr.flat(2)) // [10, 20, 30]
  • flatMap()方法是将map()flat()组合成一个方法.首先使用提供的函数的返回值创建一个新数组,然后连接该数组的所有子数组元素
    const arr = [4.25, 19.99, 25.5]
console.log(arr.map(value => [Math.round(value)])) // [[4], [20], [26]]
console.log(arr.flatMap(value => [Math.round(value)])) // [4, 20, 26]
  • 数组将被展平的深度级别为1,如果要从结果中删除项目,只需返回一个空数组
    const arr = [[7.1], [8.1], [9.1], [10.1], [11.1]]
arr.flatMap(value => {
if(value >= 10) {
return [] // 删除大于10的
} else {
return Math.round(value)
}
})
// [7, 8, 9]

PS: 除了正在处理的当前元素外,回调函数还将接收元素的索引和数组本身的引用

Symbol对象的description属性

  • 在创建Symbol时,可以为调试目的向其添加description(描述).有时候,能够直接访问代码中的description是很有用的
  • Symbol对象添加了只读属性description,该对象返回包含Symbol描述的字符串
    let sym = Symbol('foo')
console.log(sym.description) // foo sym = Symbol()
console.log(sym.description) // undefined sym = Symbol.for('bar')
console.log(sym.description) // bar

可选的catch

  • try catch语句中的catch有时候并没有用
    try {
// 使用浏览器可能尚未实现的功能
} catch (unused) {
// 这里回调函数已经帮我们处理还的错误
}
  • 上述代码中catch回调的信息并没有用处,但这样写是为了避免SyntaxError错误,ES2019可以省略catch周围的括号
    try {
// huhu
} catch {
// lala
}

个人认为目前比较好用的ECMAScript(16-20)新特性的更多相关文章

  1. ECMAScript 2016(ES7)新特性简介

    简介 自从ES6(ECMAScript 2015)在2015年发布以来,ECMAScript以每年一个版本的速度持续向前发展.到现在已经是ECMAScript 2020了. 每个版本都有一些新的特性, ...

  2. ECMAScript 2017(ES8)新特性简介

    目录 简介 Async函数 共享内存和原子操作 Object的新方法 String的新方法 逗号可以添加到函数的参数列表后面了 简介 ES8是ECMA协会在2017年6月发行的一个版本,因为是ECMA ...

  3. ECMAScript 2018(ES9)新特性简介

    目录 简介 异步遍历 Rest/Spread操作符和对象构建 Rest Spread 创建和拷贝对象 Spread和bject.assign() 的区别 正则表达式 promise.finally 模 ...

  4. ECMAScript 2019(ES10)新特性简介

    简介 ES10是ECMA协会在2019年6月发行的一个版本,因为是ECMAScript的第十个版本,所以也称为ES10. 今天我们讲解一下ES10的新特性. ES10引入了2大特性和4个小的特性,我们 ...

  5. ECMAScript 2020(ES11)新特性简介

    目录 简介 动态imports import.meta export加强 BigInt matchAll() globalThis Promise.allSettled() ??操作符 ?.操作符 总 ...

  6. ECMAScript 2021(ES12)新特性简介

    简介 ES12是ECMA协会在2021年6月发行的一个版本,因为是ECMAScript的第十二个版本,所以也称为ES12. ES12发行到现在已经有一个月了,那么ES12有些什么新特性和不一样的地方呢 ...

  7. ECMASCRIPT 6中字符串的新特性

    本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...

  8. ECMAScript 5和ECMAScript6的新特性以及浏览器支持情况

    ECMAScript简介: 它是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,javascript在它基础上经行了自己的封装.但通常来说,术语ECMAScript和java ...

  9. ECMAScript和JavaScript的区别,ECMAScript发展更新历史,ECMAScript5和ECMAScript6的新特性及浏览器支持情况,ECMAScript 5/ECMAScript 2015正式发布

    ECMAScript和JavaScript的区别 ECMA是European Computer Manufacturers Association的缩写,即欧洲计算机制造商协会.欧洲计算机制造商协会是 ...

  10. 前端开发者进阶之ECMAScript新特性--Object.create

    前端开发者进阶之ECMAScript新特性[一]--Object.create   Object.create(prototype, descriptors) :创建一个具有指定原型且可选择性地包含指 ...

随机推荐

  1. JAVA自学笔记(3)

    JAVA的心动之旅 Day1 字符串String 1.0 字符串的特点以及创建一个字符串 public class Practice {//构建字符串的3+1种方法 public static voi ...

  2. 03 . MysSQL权限和备份

    MySQL权限介绍 mysql中存在4个控制权限的表,分别为 user db tables_priv columns_priv 用户和权限内容放在mysql库中,该库中有一张名为user的表,记录了用 ...

  3. hexo命令提示 hexo <command>

    所有的hexo命令执行后都会提示 hexo <command> 解决方法: 通过hexo init blog命令初始化一个博客后,应该cd /blog 转到博客目录

  4. 如何减小SRAM读写操作时的串扰

    静态存储器SRAM是一款不需要刷新电路即能保存它内部存储数据的存储器.在SRAM 存储阵列的设计中,经常会出现串扰问题发生.那么要如何减小如何减小SRAM读写操作时的串扰,以及提高SRAM的可靠性呢, ...

  5. PAT 1036 Boys vs Girls (25分) 比大小而已

    题目 This time you are asked to tell the difference between the lowest grade of all the male students ...

  6. Docker 容器优雅终止方案

    原文链接:Docker 容器优雅终止方案 作为一名系统重启工程师(SRE),你可能经常需要重启容器,毕竟 Kubernetes 的优势就是快速弹性伸缩和故障恢复,遇到问题先重启容器再说,几秒钟即可恢复 ...

  7. Java实现 LeetCode 743 网络延迟时间(Dijkstra经典例题)

    743. 网络延迟时间 有 N 个网络节点,标记为 1 到 N. 给定一个列表 times,表示信号经过有向边的传递时间. times[i] = (u, v, w),其中 u 是源节点,v 是目标节点 ...

  8. Java实现 LeetCode 492 构造矩形

    492. 构造矩形 作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的. 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面.要求: 你设 ...

  9. 第八届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.迷宫 题目描述 X星球的一处迷宫游乐场建在某个小山坡上. 它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母. ...

  10. Mac下如何连接linux服务器(SSH)-比较好用的SSH工具推荐

    Mac下如何连接linux服务器(SSH) 1.用mac自带终端连接 步骤如下: 打开终端,在顶部shell菜单中选择新建远程连接 在右侧服务器窗口点击+号,添加服务器,输入IP等信息 输入用户名,点 ...