ES2015中有四种相等算法:(虽然写下来啦,但不知道啥意思)
1.抽象(非严格)相等比较 ( == )
2.严格相等比较 ( === ): 用于 Array.prototype.indexOf, Array.prototype.lastIndexOf, 和 case-matching
3.同值零: 用于 %TypedArray% 和 ArrayBuffer 构造函数、以及Map和Set操作, 并将用于 ES2016/ES7 中的String.prototype.includes
4.同值: 用于所有其他地方
JavaScript提供三种不同的值比较操作:
1.严格相等比较 (也被称作"strict equality", “identity”, “triple equals”),使用 === ,
2.抽象相等比较 (“loose equality”,“double equals”) ,使用 ==
3.以及 Object.is (ECMAScript 2015/ ES6 新特性)
说说===与Object有什么不同
可以理解这两种比较几乎一样只有下面两个不同
x | y | === | Object |
---|---|---|---|
+0 | -0 | true | false |
NaN | NaN | false | true |
x = Math.round(-21.5); //四舍五入 -20
y = Math.ceil(7.004); // 向上取整 8
z = Math.pow(2, 10); // 平方(基数,指数) 1024
q = Math.sqrt(9); // 平方根 3
Math.atan2
Math.ceil
Math.pow
Math.round
即使传入的参数中没有-0,这些方法的返回值都有可能是-0。例如当用 Math.pow计算-Infinity的任何负奇指数的幂都会得到-0。详情请参见这些方法各自的文档。
Math.floor
Math.max
Math.min
Math.sin
Math.sqrt
Math.tan
当传入参数中有-0时,这些方法也可能返回-0。例如, Math.min(-0, +0) 得出 -0。详情请参见这些方法各自的文档。
~
<<
“>>”
这些操作符内部都使用了ToInt32算法。因为内部32位整数类型只有一个0(没有符号区别),-0的符号在反操作后并不会保留下来。例如Object.is(~~(-0), -0)和Object.is(-0 << 2 >> 2, -0) 都会得到false.
在未考虑0的符号的情况下依赖于Object.is是危险的。当然,如果本意就是区分-0和+0的话,Object.is能按照期望完成工作。