x> = JavaScript中的x模式

Pio*_*dal 70 javascript coding-style nan d3.js

在阅读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;
};
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 79

根据我的调查,d3.min它应该适用于任何类型的可订购值,而不仅仅是数字.isNaN只会工作数字.

d3实际上是==在某个时候使用的.这个提交引入了x == x测试:

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

此提交已更改x == xx <= x(后来再次更改为x >= x):

除了与NaN自身不相等之外,由于定义的valueOf函数返回NaN,您可以拥有不可订购的对象.例如:

var o = new Number(NaN);
Run Code Online (Sandbox Code Playgroud)

o == o是真的,但却o <= o是假的.因此,d3.min,d3.max和d3.extent可能会观察到这些不可订购的值,而不是按照预期忽略它们.修复是检查!(o <= o)而不是o == o.

  • +1巧合的是,`!(o <= o)`是我试图理解Javascript的`=='平等规则时的样子. (46认同)

Pio*_*dal 9

好的,我看到这x >= xfalse了两个NaNundefined.(与isNaN(x)或不同x == x.)

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

  • 但是,无论如何,`undefined'案例已经被`!= null`所覆盖. (5认同)