您可能不知道的现代JavaScript功能



尽管过去七年来我几乎每个工作日都使用JavaScript编写代码,但我必须承认,我很少关注ES的创新新闻。 异步/等待和代理之类的主要功能是一回事,但是每年都会出现一些细微的阶段性变化,这些变化不会进入我的视野,因为总有一些需要研究的东西。

在本文中,我收集了现代JS的功能,当它们出现时并没有太多讨论。 其中一些只会增加可用性,而某些则非常实用,可以节省编写大量代码的时间。

ES2015


二进制和八进制文字


JavaScript不必经常使用二进制操作。 但是有时会出现无法解决的任务。 例如,当您为弱设备编写高性能代码时,会将位推入本地存储,在浏览器中执行RGB像素操作,或使用紧密打包的二进制数据格式。

所有这些可能需要大量工作来隐藏/组合二进制数字。 在我看来,它们总是隐藏在小数点后才徒劳。 对于这种情况,二进制文字格式已添加到ES6: 0b

 const binaryZero = 0b0; const binaryOne = 0b1; const binary255 = 0b11111111; const binaryLong = 0b111101011101101; 

这极大地简化了二进制标志的使用:

 // Pizza toppings const olives = 0b0001; const ham = 0b0010; const pineapple = 0b0100; const artechoke = 0b1000; const pizza_ham_pineapple = pineapple | ham; const pizza_four_seasons = olives | ham | artechoke; 

八进制数字也是一样。 在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 ,它允许您提供一个移位值:

 // positions 0 1 2 3 4 const array = [1, 1, 1, 2, 2]; array.includes(1, 2) === true array.includes(1, 3) === false 

有用的

签名: 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的flatmap 。如果您需要映射一个返回数组的函数,但不需要将结果作为嵌套数据结构,则此方法很有用:

 const texts = ["Hello,", "today I", "will", "use FlatMap"]; // with a plain map const mapped = texts.map(text => text.split(' ')); mapped === ['Hello', ['today', 'I'], 'will', ['use', 'FlatMap']]; // with flatmap const flatMapped = texts.flatMap(text => text.split(' ')); flatMapped === ['Hello', 'today', 'I', 'will', 'use', 'FlatMap']; 

无限捕捞


现在,您可以编写try / catch表达式,而无需引用抛出错误:

 try { // something throws } catch { // don't have to do catch(e) } 

顺便说一句,有时将不考虑e值的钩子称为处理Pokemon异常 。 因为你必须抓住他们!

字符串值修整方法


稍微好一点:

 const padded = ' Hello world '; padded.trimStart() === 'Hello world '; padded.trimEnd() === ' Hello world'; 

Source: https://habr.com/ru/post/zh-CN473816/


All Articles