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 >= x
为NaN
和undefined
提供了false
。 (不同于isNaN(x)
或x == x
。)
编辑:虽然它是x >= x
的用例之一,但在这种情况下(感谢@Felix Kling 指出这一点)undefined
已经在检查中。
【讨论】:
然而,undefined
的情况已经被!= null
覆盖了。【参考方案2】:
根据我的调查,d3.min
应该适用于任何类型的可排序值,而不仅仅是数字。 isNaN
只能处理数字。
d3 实际上在某个时候使用了==
。 This commit 介绍了x == x
测试:
与
Math.min
和Math.max
不同,为d3.min
和d3.max
返回负无穷或正无穷是没有意义的; D3 函数根据任意顺序返回最小值,而不是按数值。相反,空数组或仅包含退化值的数组的最小值或最大值应始终未定义。
This commit将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
。
【讨论】:
+1 巧合的是,!(o <= o)
是我试图理解 javascript 的 ==
平等规则时的样子。以上是关于JavaScript 中的 x >= x 模式的主要内容,如果未能解决你的问题,请参考以下文章