JS60 ES10的新特性简介
ES10/ES2019还只是一个草案,但是大多数功能在新版本的Chrome中已经实现了。
虽然ES6还没有掌握全,但是还是要紧跟时代,了解一下JavaScript的发展趋势吧
BigInt
BigInt是第七种原始类型,用来标识超出JavaScript最大安全整数之外的数字
在之前,JavaScript的数字是使用的是双精度浮点数数据类型,可以表示的最大安全整数是
2^53-1
,也就是9007199254740991
,可以使用Number.MAX_SAFE_INTEGER
来表示,如果超出这个范围指挥所未定为Number.MAX_SAFE_INTEGER + 1
现在使用BigInt就可以表示这个范围之外的整数值,有两种方式创建:
1 | let a = 10n; |
String.prototype.matchAll()
使用这个方法对字符串进行匹配时,不必再为正则表达式添加g
,直接进行全局查找,返回一个迭代器对象(可以使用for...of
遍历)
但是目前Chrome(70.0.3538.77)的实现好像有一些问题,实现的效果与match
是相同的,只是返回的不是一个数组,而是一个迭代器对象
1 | let a = 'a1a2'; |
动态导入
现在的import
是静态加载,不能将import
放在条件语句中,这就导致无法在运行时家在模块(Node的require
是运行时加载模块)
现在的提案中使用import()
方法完成动态加载,返回一个Promise对象,是一个异步加载的方法
1 | btn.addEventListener('click', async () => { |
Array.prototype.flat(depth)
对数组扁平化,可以传入参数指定递归的深度,默认深度为1
1 | let a = [[1], [2, [3]]] |
细节参考MDN
Array.prototype.flatMap(callback)
对数组每个元素使用映射函数callback
进行处理,然后将结果扁平化为一个新数组,扁平化的效果与深度为1的flat
方法相同。
1 | var arr1 = [1, 2, 3, 4]; |
细节参考MDN
Object.fromEntries(iterable)
将键值对列表iterable
转换为一个对象,这个iterable
列表需要是一个可迭代对象,返回一个新对象
实际上就是Object.entries()
的逆向操作:
1 | let obj = { apple : 10, orange : 20, banana : 30 }; |
目前最新版本的Chorme浏览器还不支持(只有Firefox支持)
细节参考MDN
String.prototype.trimStart()
和``String.prototype.trimEnd()`
别名是String.prototype.trimLeft()
和``String.prototype.trimRight()`,分别删除开头/结尾的空格
1 | let str = ' hello ' |
细节参考MDN
globalThis
对象
在JavaScript中,不同的宿主环境提供了不同的全局对象,在Web中是window
或者self
,在Node中是global
。
新的提案中规定的globalThis
对象可以无视环境,直接获取当前的全局对象
1 | // 浏览器中 |
Symbol.prototype.description
一个只读属性,用来返回声明Symbol对象时的描述符
1 | const symbol = Symbol('hello'); |
Hashbang语法
制定了一个解释器,统一了JavaScript在服务器端的执行方式
1 | $ ./index.js |
这块我不太理解,我认为如果标准化之后,是不是以为着在服务器端执行时不再显示的需要Node环境,而是默认可以在系统中执行JS文件了?
其他
还有一些内部实现的优化和改进,比如JSON.stringify
对特殊字符的处理、sort
方法的稳定性等
还有实现#
私有成员的提案,看原文吧。