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 == x为x <= x(后来再次更改为x >= x):
除了与
NaN自身不相等之外,由于定义的valueOf函数返回NaN,您可以拥有不可订购的对象.例如:Run Code Online (Sandbox Code Playgroud)var o = new Number(NaN);这
o == o是真的,但却o <= o是假的.因此,d3.min,d3.max和d3.extent可能会观察到这些不可订购的值,而不是按照预期忽略它们.修复是检查!(o <= o)而不是o == o.
好的,我看到这x >= x给false了两个NaN和undefined.(与isNaN(x)或不同x == x.)
编辑:虽然这是一个用例x >= x,在这种情况下(thx @Felix Kling指出这一点)undefined已经被检查.