Home  >  Article  >  Web Front-end  >  JavaScript 更严格的相等 [译]_javascript技巧

JavaScript 更严格的相等 [译]_javascript技巧

WBOY
WBOYOriginal
2016-05-16 17:49:51931browse
1.检测NaN
在数学上,任意值x总是与自己相等:

x = x

但这条规则并不适用于 === 和 NaN:
复制代码 代码如下:

> NaN === NaN
false

导致的结果就是,你不能通过使用indexOf方法在一个包含了NaN的数组中找到这个NaN,因为该方法在内部是使用了===来判断一个元素是否和参数中指定的值相等的:
复制代码 代码如下:

> [ NaN ].indexOf(NaN)
-1

译者注:switch语句同理
复制代码 代码如下:

switch (NaN) {
case NaN:alert(NaN);
}

如果你不能使用 === 来检测NaN,那该使用什么呢?有一个全局函数isNaN(),但这个函数有个问题,就是它总会隐式的将参数中的值转换成数字再做判断,这样就在判断很多明显不是NaN的值的时候也返回了true:
复制代码 代码如下:

> isNaN("foo")
true

解释:"foo"被转换成了数字NaN.
复制代码 代码如下:

> Number("foo")
NaN

另外一个检测NaN的方法就是利用NaN是唯一一个与自身严格不相等的值:
复制代码 代码如下:

function myIsNaN(value) {
return value !== value;
}

另外一个更易懂的方法是在使用isNaN()之前先检查一下这个值是不是数字类型.这样就避免了隐式转换的问题.
复制代码 代码如下:

function myIsNaN2(value) {
return typeof value === 'number' && isNaN(value);
}

ECMAScript.next中将会有一个新的Number.isNaN()方法,它是一个修正版的isNaN()函数.

2.区分-0和+0

这样的需求很少见,但有时候你的确需要区分+0(正零)和-0(负零),在JavaScript中,这是两个不同的值.但===不能判断出来:
复制代码 代码如下:

> -0 === +0
true

那到底该怎么来区分呢?在JavaScript中.如果让一个正数除以−0,结果是-Infinity.如果除以+0,则结果是Infinity.这两个无穷大值是可以使用===来判断的:
复制代码 代码如下:

> 1 / -0
-Infinity

> 1 / +0
Infinity

> Infinity === -Infinity
false

译者注:写成函数就是
复制代码 代码如下:

function isPositiveZero(zero){
return 1/zero === Infinity

}
function isNegativeZero(zero){
return 1/zero === -Infinity
}


3.ECMAScript.next中更严格的相等:“is”操作符

ECMAScript.next会有一个 is” 操作符,它的作用就是"更严格的相等”:它能把NaN看作等于自身,还能区分开-0和+0.还有一个相反的操作符称为“isnt”.例如:
复制代码 代码如下:

> NaN is NaN
true

> -0 isnt +0
true


目前这个操作符可以由Object.is()方法来弥补.这个方法可以这样实现:

复制代码 代码如下:

Object.is = function(x, y) {
if (x === y) {
// x === 0 => 比较+0和-0
return x !== 0 || (1/x === 1/y);
}

// x !== y => 只有在x和y都是NaN时才返回true
return x !== x && y !== y;
};


3.1 尝试Object.is()

如果你想尝试一下Object.is(),你可以使用es6-shim,它可以将ECMAScript.next(ECMAScript 6)中的一些特性移植到ECMAScript 5中.

译者注:如果想在ES3的环境上使用,则还得使用es5-shim

4.参考
  1. Equality in JavaScript: === versus ==
  2. ECMAScript.next: the “TXJS” update by Eich
  3. NaN and Infinity in JavaScript
  4. es6-shim – ECMAScript 6 functionality on ECMAScript 5
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn