微信扫一扫
分享到朋友圈

ES7 只有两个新功能,这是它们的工作原理

作者:程序员的那些事 来源:程序员的那些事 公众号
分享到:

04-08

(点击上方公众号,可快速关注)


编译: 伯乐在线/唐耶尔


让我们来聊一聊 JavaScript 新版本:ECMAScript 2016 (通常被称为 ES7)。


ES7 带来了两个新功能:Array.prototype.includes() 和 新的指数运算符:**


Array.prototype.includes()


使用 .indexOf() 来确定一个元素是否在数组中存在的方式已经成为历史。


['my','mom','hates','me'].indexOf('mom')  // 1


// 虽然有些难以理解,但返回值 1 表示 'mom' 字符串在数组中的索引值,而不是数组中只有一个 'mom'。


重点其实是“存在”。


.indexOf() 的“本职工作”应该是用来确定某个值在数组中的索引。


而如果我们的目的是确定一个元素是否在数组中存在,那么使用 .indexOf() 并不是最好的选择。理由很简单:当查询某个东西的存在性时我们希望得到一个布尔值,而不是数值。


Array.prototype.includes() 做的恰恰就是这件事。它能确定数组中是否包含给定元素,有就返回 true,否则返回 false 。


var life = ['mom', 'dad', 'brother']

 

life.includes('mom')          // true

life.includes('girlfriend')   // false


深入标准


Array.prototype.includes ( searchElement [ , fromIndex ] )


  • searchElement —— 要查找的元素。

  • fromIndex (可选的) — 开始查询的起始索引。


深入了解 规范,就像一次寻找力量之旅。


规范中的内容如下:


让我们循序渐进,用一些例子来理解规范。


includes

 

[1] searchs in ascending order

搜索按升序进行

Array(10000000).concat(4).includes(4)

true # [Time] 500 miliseconds 耗时 500ms

[4].concat(Array(10000000)).includes(4)

true # [Time] 90 miliseconds 耗时 90ms

 

[2] uses SameValueZero algorithm

使用 SameValueZero 算法比较

[NaN].indexOf(NaN)

-1

[NaN].includes(NaN)

true

 

[3] if found at any position returns true

otherwise, false is returned

在任何位置找到都会返回 true,否则返回 false

[1, 2, 3].includes(2)

true

[1, 2, 3].includes(7)

false

 

[4] it treats missing array elements as undefined

将数组中缺失的元素视为 undefined

[1, , 3].indexOf(undefined)

-1

[1, , 3].includes(undefined)

true


  1. 这里的区别是元素 4 的位置。在第一个例子中 4 位于数组末尾,所以 includes 方法会搜索整个数组。按规范,.includes() 方法会在找到 searchElement 后立即返回,所以第二个例子执行地更快。

  2. SameValueZero 算法与严格相等比较(.indexOf()采用)的最大区别就是它允许检测 NaN 元素。

  3. 元素被找到就返回 true,否则返回 false。不再使用索引作为结果了

  4. 与 .indexOf() 相反,.includes() 并不会跳过缺失的数组元素,而会将其视为 undefined。


你已经开始感受到力量了么?我们还没说 fromIndex 呢。


规范中是这样写的:


可选的第二参数 fromIndex 默认值为 0(这意味整个数组都会被搜索)。如果这个参数的值大于或等于数组长度,则会直接返回 false ,数组将不会被搜索。如果值为是负数,则代表相对于数组末尾的偏移量。如果偏移量超过数组长度,则整个数组都会被搜索。


fromIndex

 

[1] it defaults to 0

默认为 0

[1,2,3].includes(1)

true

 

[2] if >= array.length, false is returned

如果 >= array.length, 返回 false

[1,2,3].includes(1, 10)

false

 

[3] if negative, it is used as the offset, i.e.

如果为负数,则被用作偏移

offset = array.length + fromIndex

[1,2,3].includes(3, -2) # fromIndex = 3 (array length) + -2 (fromIndex) = 1

true

 

[4] if offset < 0, the whole array is searched

如果根据偏移计算的搜索起始索引 < 0,则整个数组都会被搜索

[1,2,3].includes(1, -5) # fromIndex = 0

true


  1. 如果不提供 fromIndex 参数则默认其为 0 ,这时整个数组都将被搜索。

  2. 当 fromIndex 大于数组长度时,.includes() 立即返回 false。

  3. 如果 fromIndex 是负值, 那么起始索引计算方式为 array.length — fromIndex 。这在搜索数组末尾元素时很有用。例如 fromIndex = -5 意味着只搜索最后 5 个元素。

  4. 为了避免 .includes() 执行中断,当计算得到的起始索引小于 0 时,整个数组会被搜索。我个人更希望中断

阅读9058
举报0
关注程序员的那些事微信号:iProgrammer

用微信扫描二维码即可关注
声明

1、头条易读遵循行业规范,任何转载的稿件都会明确标注作者和来源;
2、本文内容来自“程序员的那些事”微信公众号,文章版权归程序员的那些事公众号所有。

评论
更多

文章来自于公众号:

程序员的那些事

微信号:iProgrammer

邮箱qunxueyuan#163.com(将#换成@)
微信编辑器
免责声明
www.weixinyidu.com   免责声明
版权声明:本站收录微信公众号和微信文章内容全部来自于网络,仅供个人学习、研究或者欣赏使用。版权归原作者所有。禁止一切商业用途。其中内容并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现头条易读网站上有侵犯您的知识产权的内容,请与我们联系,我们会及时修改或删除。
本站声明:本站与腾讯微信、微信公众平台无任何关联,非腾讯微信官方网站。