JavaScript中的x> = x模式


70

在阅读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;
};


@FelixKling谢谢!我实际上是在寻找一些带注释的源代码,但似乎没有:d3.js源代码的带注释的副本,如jQuery的那样?
Piotr Migdal

Answers:


79

根据我的调查,d3.min应该适用于任何类型的可排序值,而不仅仅是数字。isNaN将只工作数字。

d3实际上==在某个时候正在使用。该提交引入了x == x测试:

Math.min和不同的是Math.max,为d3.min和返回负或正无穷大是没有意义的d3.max。D3函数根据任意顺序而不是数字值返回最小值。相反,应该始终未定义空数组或仅包含简并值的数组的最小值或最大值。

此提交更改x == xx <= 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


46
巧合的是,+ 1!(o <= o)是我试图弄清Javascript的==平等规则时的表情。
user56reinstatemonica8 2015年

9

OK,我看到x >= xfalse两个NaNundefined。(与isNaN(x)或不同x == x。)

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


5
但是,无论如何,undefined此案已经涉及!= null了。
Felix Kling 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.