ES标准中的比较算法

ES中的 ===== 都很熟悉了。

两者的区别:

  • == 在类型相同时,使用 === 判断,=== 在类型不同时直接false

  • == 会在类型不同时,发生隐式转换

    规则如下:

    (1)一个 null,一个 undefied,那么true

    (2)一个字符串,一个数值,会把字符串转成数值之后再进行比较

熟悉ES6不会对Object.is()陌生

NaN独白:懂我的人终于出现(≧▽≦)/

1
2
Object.is(NaN, NaN) // true
Object.is(0, -0) // false

js中我们一般认为正负0是不相等的,然而===情况下NaN不等于NaN+0等于-0

简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
if (!Object.is) {
Object.is = function(x, y) {
if (x === y) {
// 针对 +0不等于-0
// 1 / -0 < 0
// 1 / +0 > 0
return x !== 0 || 1 / x === 1 / y;
} else {
// 针对 NaN等于NaN
return x !== x && y !== y;
}
};
}

这里重点提到ES标准中的 SameValueZero 算法

1
2
3
4
5
const s = new Set()
s.add(0)
s.add(NaN)
s.has(-0) // true
s.has(NaN) // true

Object.is()比较算法的区别就在 +0 和 -0是一样的。

1
2
3
const a = [0, NaN]
a.includes(-0) // true
a.includes(NaN) // true

可以看出includes也是基于 SameValueZero 来比较的。

-------------要说再见啦感谢大佬的光临~-------------