小云是一枚尚未脱发的程序员,最近看到ES热度这么高,决定蹭一波热度。程序员
小云首先看到了ES7中新增的**运算符,心中暗喜:这么简单?es6
8 ** 3 // 512
Math.pow(8, 3) // 512
复制代码
可是小云喜欢瞎折腾,因而他又敲了下列代码:算法
2 ** 2 ** 0 // 2
复制代码
结果居然是2,小云带着疑惑查了查资料,原来**运算符是右结合的:数组
(2 ** 2) ** 0 // 1
复制代码
小云终于获得了本身预期的结果,并且还发现了底数的前面不能紧跟一元运算符,即便是+也不行。学习
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
数个小时以后,小云要开始他的表演了。
对于前两个你们再熟悉不过了,在我刚学JS的时候,只是经过本身长期累积的经验去区别二者的差别:
[1, 2, 3] == '1,2,3' // true
['1'] == 1 // true
复制代码
以致于遇到上述状况惊叹不已,可是了解原理以后,一切变得那么的简单。
NaN == NaN // false
-0 == 0 // true
复制代码
前面两条不难理解,经过['1'] == true比较的过程,熟悉一下第三条规则:
这时你再遇到:
[] == false // true
复制代码
是否是很轻松就知道结果了。
对于这个算法须要注意的地方是在Number类型的比较上:
NaN === NaN // false
-0 === 0 // true
复制代码
Tip: 上述方法的分析可能是基于ES5.1,在ES6中都有细微的改变,好比加入Symbol的比较。
对于熟练使用ES6的小伙伴,多知道Object.is()这个方法:
Object.is(NaN, NaN) // true
Object.is(0, -0) // false
复制代码
而Object.is内部采用的比较算法就是SameValue(x, y),而它与 === 的区别也正是这两种状况。
可是你在使用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。
喜欢本文的小伙伴们,欢迎关注个人订阅号超爱敲代码,查看更多内容.