x > = x patrón en JavaScript


Al leer la fuente de D3.js Vi x >= x patrón. Si es para detectar NAN entre números, ¿por qué no solo isNaN(x) o x == x?

Fuente, donde lo encontré :

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;
};
Author: Diptendu, 2015-06-21

2 answers

De mis investigaciones, d3.min se supone que trabaja en cualquier tipo de valores ordenables, no solo números. isNaN solo funcionarían los números.

D3 estaba usando == en algún momento. Esta confirmación introdujo la prueba x == x:

A diferencia de Math.min y Math.max, no tiene sentido devolver infinito negativo o positivo para d3.min y d3.max; las funciones D3 devuelven el valor mínimo de acuerdo con un orden arbitrario, no por valor numérico. En su lugar, el mínimo o máximo de una matriz vacía, o una matriz que contiene solo valores degenerados, siempre debe ser indefinida.

Este commit cambió x == x a x <= x (que más tarde fue cambiado de nuevo a x >= x):

Además de NaN, que no es igual a sí mismo, puede tener objetos que no son ordenables debido al valor definido de las funciones que devuelven NaN. Por ejemplo:

var o = new Number(NaN);

Aquí, o == o es verdadero, pero o <= o es falso. Por lo tanto, era posible para d3.min, d3.max y d3.grado de observar estos valores no ordenables en lugar de ignorarlos como se pretende. La solución es comprobar !(o <= o) en lugar de o == o.

 79
Author: Felix Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-21 17:45:55

OK, veo que x >= x da false para ambos NaN y undefined. (A diferencia de isNaN(x) o x == x.)

EDITAR: Si bien es uno de los casos de uso de x >= x, en este caso (thx @Felix Kling para señalar esto) undefined ya está siendo comprobado.

 8
Author: Piotr Migdal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-21 21:49:34