这多是你学习ES7遗漏的知识点

小云是一枚尚未脱发的程序员,最近看到ES热度这么高,决定蹭一波热度。程序员

ES7新增的特性

  • Array.prototype.includes
  • **

**

小云首先看到了ES7中新增的**运算符,心中暗喜:这么简单?es6

8 ** 3 // 512
  Math.pow(8, 3) // 512
复制代码

可是小云喜欢瞎折腾,因而他又敲了下列代码:算法

2 ** 2 ** 0 // 2
复制代码

结果居然是2,小云带着疑惑查了查资料,原来**运算符是右结合的:数组

(2 ** 2) ** 0 // 1
复制代码

小云终于获得了本身预期的结果,并且还发现了底数的前面不能紧跟一元运算符,即便是+也不行。学习

Array.prototype.includes

Tip: 为何这个方法不叫contains呢?由于一些Bug,它被重命名为includesui

接下来,小云开始学习includes方法:spa

[1, 2, 1].includes(1) // true
复制代码

小云又敲下了以前用来判断数组中的元素是否存在的代码:prototype

if ([1, 2, 1].indexOf(1) !== -1) {
    // true
  }
复制代码

哇!终于能够摆脱那个使人讨厌的!== -1了。code

难道这两个方法仅仅是在返回值上有区别吗?小云此次决定再也不瞎折腾,直接移步ES7文档cdn

数个小时以后,小云要开始他的表演了。

ES标准的相等比较算法

  • The Abstract Equality Comparison Algorithm (==)
  • The Strict Equality Comparison Algorithm (===)
  • SameValue (Object.is())
  • SameValueZero (暂未提供API)

对于前两个你们再熟悉不过了,在我刚学JS的时候,只是经过本身长期累积的经验去区别二者的差别:

[1, 2, 3] == '1,2,3' // true
  ['1'] == 1 // true
复制代码

以致于遇到上述状况惊叹不已,可是了解原理以后,一切变得那么的简单。

The Abstract Equality Comparison Algorithm

  • 当类型相同时,特殊性在于NaN, -0, 0。
NaN == NaN // false
  -0 == 0 // true
复制代码
  • 当类型不一样时,第一条准则是:null与undefined相等
  • 当类型不一样时,第二条准则是:全部的比较最终多会转化为数值的比较,而它转化的优先级是Boolean => Object => String

前面两条不难理解,经过['1'] == true比较的过程,熟悉一下第三条规则:

  • 将右边的Boolean类型转化为Number类型, 转化为 ['1'] == 1
  • 将左边的Object类型转化为原始值,转化为 '1' == 1
  • 将左边的String类型转化为Number类型, 转化为 1 == 1

这时你再遇到:

[] == false // true
复制代码

是否是很轻松就知道结果了。

The Strict Equality Comparison Algorithm

对于这个算法须要注意的地方是在Number类型的比较上:

NaN === NaN // false
  -0 === 0 // true
复制代码

Tip: 上述方法的分析可能是基于ES5.1,在ES6中都有细微的改变,好比加入Symbol的比较。

SameValue

对于熟练使用ES6的小伙伴,多知道Object.is()这个方法:

Object.is(NaN, NaN) // true
  Object.is(0, -0) // false
复制代码

而Object.is内部采用的比较算法就是SameValue(x, y),而它与 === 的区别也正是这两种状况。

SameValueZero

可是你在使用es6中有没有疑惑这种状况:

const s = new Set()
  s.add(0)
  s.add(NaN)
  s.has(-0) // true
  s.has(NaN) // true
复制代码

是否是与上述的三种算法的表现多不同,这就是第四种比较算法SameValueZero,它与SameValue的区别主要在于0与-0是否相等。

因此你在实践includes方法时,遇到:

const a = [0, NaN]
  a.includes(-0) // true
  a.includes(NaN) // true
复制代码

就不用大惊小怪了,由于includes内部使用的比较算法就是SameValueZero。

参考文献


    喜欢本文的小伙伴们,欢迎关注个人订阅号超爱敲代码,查看更多内容.

相关文章
相关标签/搜索