x >= x patrón en JavaScript

3 minutos de lectura

avatar de usuario
Piotr Migdal

Al leer la fuente de D3.js vi x >= x patrón. Si es para detectar NaN entre números, ¿por qué no simplemente 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;
};

  • Echa un vistazo a las confirmaciones que introdujeron la lógica: github.com/mbostock/d3/commit/…, github.com/mbostock/d3/commit/…

    – Félix Kling

    21 de junio de 2015 a las 17:31

  • @FelixKling ¡Gracias! De hecho, estaba buscando un código fuente anotado, pero parece que no hay ninguno: ¿una copia anotada del código fuente d3.js como el de jQuery?

    –Piotr Migdal

    21 de junio de 2015 a las 17:33

avatar de usuario
Félix Kling

De mis investigaciones, d3.min se supone que funciona en cualquier tipo de valores ordenables, no solo números. isNaN solo trabajaría números.

d3 en realidad estaba usando == en algún momento. este compromiso introdujo el x == x prueba:

A diferencia de Math.min y Math.maxno tiene sentido devolver infinito negativo o positivo para d3.min y d3.max; las funciones D3 devuelven el valor mínimo según un orden arbitrario, no por valor numérico. En cambio, el mínimo o el máximo de una matriz vacía, o una matriz que contiene solo valores degenerados, siempre debe estar sin definir.

este compromiso cambió x == x a x <= x (que más tarde se cambió de nuevo a x >= x):

Además de NaN, que no es igual a sí mismo, puede tener objetos que no se pueden ordenar debido a las funciones valueOf definidas que devuelven NaN. Por ejemplo:

var o = new Number(NaN);

Aquí, o == o es cierto, pero o <= o Es falso. Por lo tanto, era posible que d3.min, d3.max y d3.extent observaran estos valores no ordenables en lugar de ignorarlos según lo previsto. La solución es comprobar !(o <= o) más bien que o == o.

  • +1 casualmente, !(o <= o) es cómo se ve mi cara cuando trato de dar sentido a Javascript == reglas de igualdad

    – usuario56reinstatemonica8

    22 de junio de 2015 a las 12:19

avatar de usuario
Piotr Migdal

bien, 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 >= xen este caso (gracias @Felix Kling por señalar esto) undefined ya se esta revisando.

  • sin embargo, el undefined El caso ya está cubierto con != null de todos modos.

    – Félix Kling

    21 de junio de 2015 a las 17:32

¿Ha sido útil esta solución?