web-dev-qa-db-ja.com

JavaScriptのx> = xパターン

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;
};
_
70
Piotr Migdal

私の調査によると、_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)をチェックすることです。

79
Felix Kling

OK、_x >= x_はfalseNaNの両方にundefinedを与えることがわかりました。 (isNaN(x)または_x == x_とは異なります。)

編集:これは_x >= x_の使用例の1つですが、この場合(これを指摘するための@Felix Klingです)undefinedはすでにチェックされています。

9
Piotr Migdal