JavaScript中的x> = x模式

在阅读D3.js的源代码时,我看到了x >= x模式。 如果是为了检测数字中的NaN,为什么不只是isNaN(x)x == x

来源,我遇到它的地方 :

 d3.min = function(array, f) { var i = -1, n = array.length, a, b; if (arguments.length === 1) { while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; } while (++i < n) if ((b = array[i]) != null && a > b) a = b; } else { while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { a = b; break; } while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; } return a; }; 

从我的调查来看, d3.min本来就是用来处理任何可d3.min价值观,而不仅仅是数字。 isNaN只会工作号码。

D3实际上在某个时候使用== 。 这个提交引入了x == xtesting:

Math.minMath.max不同的是,为d3.mind3.max返回负值或正值的无穷大是没有意义的。 D3函数根据任意顺序返回最小值,而不是数值。 相反,空数组的最小值或最大值或者只包含退化值的数组应始终未定义。

这个提交将x == x更改为x <= x (后来再次更改为x >= x ):

除了不等于自身的NaN ,由于定义了返回NaN的valueOf函数,您可以拥有无​​法订购的对象。 例如:

 var o = new Number(NaN); 

这里, o == o是正确的,但是o <= o是错误的。 因此,d3.min,d3.max和d3.extent有可能观察到这些不可订货的价值,而不是按照预期来忽略它们。 解决办法是检查!(o <= o)而不是o == o

好的,我看到x >= xNaNundefined都是false 。 (与isNaN(x)x == x

编辑:虽然它是x >= x的用例之一,在这种情况下(thx @Felix Kling指出这一点) undefined已被检查。