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;
};
_
私の調査によると、_d3.min
_は数値だけでなく、あらゆる種類の順序付け可能な値で機能するはずです。 isNaN
は数値のみを処理します。
d3は実際にある時点で_==
_を使用していました。 このコミット _x == x
_テストが導入されました:
_
Math.min
_および_Math.max
_とは異なり、_d3.min
_および_d3.max
_に対して負または正の無限大を返すことは意味がありません。 D3関数は、数値ではなく任意の順序で最小値を返します。代わりに、空の配列、または縮退した値のみを含む配列の最小値または最大値は、常に未定義である必要があります。
このコミット は_x == x
_を_x <= x
_に変更しました(後で再び_x >= x
_に変更されました):
それ自体とは異なる
NaN
に加えて、NaNを返すvalueOf関数が定義されているため、オブジェクトを順序付けできない場合があります。例えば:_var o = new Number(NaN);
_ここでは、_
o == o
_はtrueですが、_o <= o
_はfalseです。したがって、d3.min、d3.max、およびd3.extentは、これらの順序付けできない値を意図したとおりに無視するのではなく、観察することが可能でした。修正は、_o == o
_ではなく!(o <= o)
をチェックすることです。
OK、_x >= x
_はfalse
とNaN
の両方にundefined
を与えることがわかりました。 (isNaN(x)
または_x == x
_とは異なります。)
編集:これは_x >= x
_の使用例の1つですが、この場合(これを指摘するための@Felix Klingです)undefined
はすでにチェックされています。