JavaScript 中的 x >= x 模式

Posted

技术标签:

【中文标题】JavaScript 中的 x >= x 模式【英文标题】:x >= x pattern in JavaScript 【发布时间】:2015-09-07 03:46:57 【问题描述】:

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

Source, where I encountered it:

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;
;

【问题讨论】:

看看引入逻辑的提交:github.com/mbostock/d3/commit/…, github.com/mbostock/d3/commit/… @FelixKling 谢谢!我实际上是在寻找一些带注释的源代码,但似乎没有:annotated copy of d3.js source code like the one for jQuery? 【参考方案1】:

好的,我看到x &gt;= xNaNundefined 提供了false。 (不同于isNaN(x)x == x。)

编辑:虽然它是x &gt;= x 的用例之一,但在这种情况下(感谢@Felix Kling 指出这一点)undefined 已经在检查中。

【讨论】:

然而,undefined 的情况已经被!= null 覆盖了。【参考方案2】:

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

d3 实际上在某个时候使用了==。 This commit 介绍了x == x 测试:

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

This commit将x == x改为x &lt;= x(后来又改为x &gt;= x):

除了不等于自身的NaN 之外,您还可以拥有由于定义的返回NaN 的valueOf 函数而无法排序的对象。例如:

var o = new Number(NaN);

这里,o == o 为真,但o &lt;= o 为假。因此,d3.min、d3.max 和 d3.extent 可以观察这些不可排序的值,而不是按预期忽略它们。解决方法是检查!(o &lt;= o) 而不是o == o

【讨论】:

+1 巧合的是,!(o &lt;= o) 是我试图理解 javascript== 平等规则时的样子。

以上是关于JavaScript 中的 x >= x 模式的主要内容,如果未能解决你的问题,请参考以下文章

python中的模块化加法

饱和操作和模操作

模_板

模线性方程组

Codeforces1103 B. Game with modulo(取模性质,二分)

CF438D The Child and Sequence