视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JavaScript更严格的相等[译]_javascript技巧
2020-11-27 21:05:06 责编:小采
文档


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

下载本文
显示全文
专题