x> = x Muster in JavaScript

70

Beim Lesen der Quelle von D3.js sah ich x >= xMuster. Wenn es zum Nachweis von NaNs unter Zahlen dient, warum nicht einfach isNaN(x)oder x == x?

Quelle, wo ich darauf gestoßen bin :

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;
};
Piotr Migdal
quelle
14
Schauen Sie sich die Commits an, die die Logik eingeführt haben: github.com/mbostock/d3/commit/… , github.com/mbostock/d3/commit/…
Felix Kling
@ FelixKling Danke! Ich habe tatsächlich nach einem kommentierten Quellcode gesucht, aber es scheint, dass es keinen gibt: eine kommentierte Kopie des d3.js-Quellcodes wie die für jQuery?
Piotr Migdal

Antworten:

79

Nach meinen Untersuchungen d3.minsoll an jeder Art von bestellbaren Werten gearbeitet werden, nicht nur an Zahlen. isNaNwürde nur Zahlen arbeiten.

d3 wurde tatsächlich ==irgendwann verwendet. Dieses Commit führte den x == xTest ein:

Im Gegensatz zu Math.minund Math.maxist es nicht sinnvoll, negative und positive Unendlichkeit für d3.minund zurückzugeben d3.max. Die D3-Funktionen geben den Minimalwert in beliebiger Reihenfolge zurück, nicht nach numerischen Werten. Stattdessen sollte das Minimum oder Maximum eines leeren Arrays oder eines Arrays, das nur entartete Werte enthält, immer undefiniert sein.

Dieses Commit wurde geändert x == xin x <= x(was später wieder geändert wurde x >= x):

Darüber hinaus NaNkönnen Sie Objekte haben, die aufgrund definierter valueOf-Funktionen, die NaN zurückgeben, nicht bestellbar sind. Zum Beispiel:

var o = new Number(NaN);

Hier o == oist wahr, aber o <= ofalsch. Daher war es d3.min, d3.max und d3.extent möglich, diese nicht geordneten Werte zu beobachten, anstatt sie wie beabsichtigt zu ignorieren. Das Update ist !(o <= o)eher zu überprüfen als o == o.

Felix Kling
quelle
46
+1 zufällig !(o <= o)sieht mein Gesicht so aus, wenn ich versuche, die ==Gleichstellungsregeln von Javascript zu verstehen .
user56reinstatemonica8
9

OK, ich sehe das x >= xgibt falsefür beide NaNund undefined. (Im Gegensatz zu isNaN(x)oder x == x.)

BEARBEITEN: Während dies einer der Anwendungsfälle von ist x >= x, wird in diesem Fall (danke @Felix Kling für den Hinweis) undefinedbereits geprüft.

Piotr Migdal
quelle
5
Der undefinedFall ist jedoch != nullohnehin schon abgedeckt .
Felix Kling