
尽管过去七年来我几乎每个工作日都使用JavaScript编写代码,但我必须承认,我很少关注ES的创新新闻。 异步/等待和代理之类的主要功能是一回事,但是每年都会出现一些细微的阶段性变化,这些变化不会进入我的视野,因为总有一些需要研究的东西。
在本文中,我收集了现代JS的功能,当它们出现时并没有太多讨论。 其中一些只会增加可用性,而某些则非常实用,可以节省编写大量代码的时间。
ES2015
二进制和八进制文字
JavaScript不必经常使用二进制操作。 但是有时会出现无法解决的任务。 例如,当您为弱设备编写高性能代码时,会将位推入本地存储,在浏览器中执行RGB像素操作,或使用紧密打包的二进制数据格式。
所有这些可能需要大量工作来隐藏/组合二进制数字。 在我看来,它们总是隐藏在小数点后才徒劳。 对于这种情况,二进制文字格式已添加到ES6:
0b
。
const binaryZero = 0b0; const binaryOne = 0b1; const binary255 = 0b11111111; const binaryLong = 0b111101011101101;
这极大地简化了二进制标志的使用:
八进制数字也是一样。 在JS世界中,这是一个利基机会,但是它们通常用于网络和某些文件格式。 您可以使用
0o
语法编写八进制数字。
Number.isNaN()
不要与
window.isNaN()
混淆,这是一种具有更直观行为的新方法。
经典的
isNaN
有一些有趣的技巧:
isNaN(NaN) === true isNaN(null) === false isNaN(undefined) === true isNaN({}) === true isNaN('0/0') === true isNaN('hello') === true
这给了我们什么? 首先,这些参数实际上都不是
NaN
。 像往常一样,问题出在所有“喜欢的” JavaScript属性上:类型转换。 使用
Number
函数将
window.isNaN
的参数
window.isNaN
为数字。
新的静态
Number.isNaN()
方法解决了此问题。 他一劳永逸地返回传给他和
NaN
的观点平等。 这是绝对清楚的:
Number.isNaN(NaN) === true Number.isNaN(null) === false Number.isNaN(undefined) === false Number.isNaN({}) === false Number.isNaN('0/0') === false Number.isNaN('hello') === false
签名: Number.isNaN : (value: any) => boolean
ES2016
求幂运算符
有时会发生这种情况,因此最好手头准备语法以求幂:
2**2 === 4 3**2 === 9 3**3 === 27
奇怪,但是我
确定这已经在JavaScript中存在。 也许与Python混淆了。
Array.prototype.includes()
很难错过,但是如果您在过去三年中写了
array.indexOf(x) !== -1
,那么您
array.indexOf(x) !== -1
新的
includes
方法感到高兴:
[1, 2, 3].includes(2) === true [1, 2, 3].includes(true) === false
includes
使用
相同值零算法 ,该
算法与严格相等性检查(
===
)几乎相同,除了它可以处理
NaN
值。 该算法还通过链接而不是内容来比较对象:
const object1 = {}; const object2 = {}; const array = [object1, 78, NaN]; array.includes(object1) === true array.includes(object2) === false array.includes(NaN) === true
includes
可以包含第二个参数
fromIndex
,它允许您提供一个移位值:
有用的
签名: Array.prototype.includes : (match: any, offset?: Int) => boolean
ES2017
共享内存和原子操作
这些是几个很棒的功能,如果您需要与Web Worker进行大量工作,这些功能将是非常宝贵的。 您可以直接与多个进程共享内存并设置锁以避免竞争情况。
这是具有相当复杂的API的两项重要功能,因此在此不再赘述。 有关详细信息,请发送给本文:
https :
//www.sitepen.com/blog/the-return-of-sharedarraybuffers-and-atomics/ 。 并非所有浏览器都支持这些功能,但我希望这种情况在未来几年内会有所改善。
ES2018
正则表达式的金矿
ES2018具有一大堆新的正则表达式功能:
后向匹配项(与以前的字符匹配)
在支持此功能的运行时中,您现在可以编写正则表达式,查找匹配
之前的字符。 例如,要查找所有带有美元符号的数字:
const regex = /(?<=\$)\d+/; const text = 'This cost $400'; text.match(regex) === ['400']
这与新的后向组,双前行组有关:
Look ahead: (?=abc) Look behind: (?<=abc) Look ahead negative: (?!abc) Look behind negative: (?<!abc)
不幸的是,今天您无法将新的隐藏式语法转换为较旧的浏览器,因此很有可能只能在Node中使用一段时间。
命名捕获组
正则表达式现在可以选择子样本,并用于简单解析。 直到最近,我们只能通过数字来引用这些片段,例如:
const getNameParts = /(\w+)\s+(\w+)/g; const name = "Weyland Smithers"; const subMatches = getNameParts.exec(name); subMatches[1] === 'Weyland' subMatches[2] === 'Smithers'
现在,有一种语法可以命名这些子样本(或记录组):如果要给组命名,请在开头的方括号内放入
?<titl>
:
const getNameParts = /(?<first>\w+)\s(?<last>\w+)/g; const name = "Weyland Smithers"; const subMatches = getNameParts.exec(name); const {first, last} = subMatches.groups first === 'Weyland' last === 'Smithers'
不幸的是,这仅适用于Chrome和Node。
现在点可以标记新行
仅需附加
/s
标志,例如
/anotherRegex./sg
。
ES2019
Array.prototype.flat()和flatMap()
我很高兴在MDN上看到此消息。
简而言之,
flat()
在给定的最大深度下将多维数组转换为一维数组:
const multiDimensional = [ [1, 2, 3], [4, 5, 6], [7,[8,9]] ]; multiDimensional.flat(2) === [1, 2, 3, 4, 5, 6, 7, 8, 9]
flatMap
是后面是深度为1的
flat
的
map
。如果您需要映射一个返回数组的函数,但不需要将结果作为嵌套数据结构,则此方法很有用:
const texts = ["Hello,", "today I", "will", "use FlatMap"];
无限捕捞
现在,您可以编写try / catch表达式,而无需引用抛出错误:
try {
顺便说一句,有时将不考虑
e
值的钩子称为
处理Pokemon异常 。 因为你必须抓住他们!
字符串值修整方法
稍微好一点:
const padded = ' Hello world '; padded.trimStart() === 'Hello world '; padded.trimEnd() === ' Hello world';