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. 【译】Welcome to C# 9.0

    C# 9.0正在形成,我想分享我们对添加到该语言下个版本的一些主要功能的看法.对于每个新版本的 C#,我们努力使常见的编码方案更加清晰和简单,C# 9.0 也不例外.这次的一个特别重点是支持数据形状的 ...

  2. 一次FGC导致CPU飙高的排查过程

    今天测试团队反馈说,服务A的响应很慢,我在想,测试环境也会慢?于是我自己用postman请求了一下接口,真的很慢,竟然要2s左右,正常就50ms左右的. 于是去测试服务器看了一下,发现服务器负载很高, ...

  3. Alpha冲刺 —— 5.6

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...

  4. Java实现 LeetCode 515 在每个树行中找最大值

    515. 在每个树行中找最大值 您需要在二叉树的每一行中找到最大的值. 示例: 输入: 1 / \ 3 2 / \ \ 5 3 9 输出: [1, 3, 9] /** * Definition for ...

  5. Java实现 蓝桥杯VIP 算法提高 不同单词个数统计

    算法提高 不同单词个数统计 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数.例如:对于句子"one little t ...

  6. Java实现 蓝桥杯VIP 算法训练 矩阵乘方

    算法提高 矩阵乘方 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个矩阵A,一个非负整数b和一个正整数m,求A的b次方除m的余数. 其中一个nxn的矩阵除m的余数得到的仍是一个nxn的 ...

  7. java实现字符串比较

    标题:字符串比较 我们需要一个新的字符串比较函数compare(s1, s2). 对这个函数要求是: 1. 它返回一个整数,表示比较的结果. 2. 结果为正值,则前一个串大,为负值,后一个串大,否则, ...

  8. Linux脚本安装包

    脚本安装包 并不是独立的软件安装包类型,常见安装的是源码包,是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简答的参数,就可以实现安装,非常类似于Windows下软件的安装方式. 安装过程(安 ...

  9. github常用的协同开发流程

    github的实用之处 对于刚刚工作的小白来说,顺利完成工作任务是首要考虑的事情,业余时间多了解了解其他的技术将有利于自己对该领域的熟悉,比如我们都拥有的github,除了在网站里查看优秀的代码,其还 ...

  10. 给Linux小白的CentOS8.1基本安装说明

    写在前面的话:用过Linux的同学应该都会觉得Linux安装是件非常简单的事情,根本不值得用博客记下来!但是我发现,其实没接触过Linux的同学还真不一定会装,就像在IT行业工作过几年但一直用Wind ...