not - javascript que es
x>=x patrĂ³n en JavaScript (2)
OK, veo que
x >= x
da
false
tanto para
NaN
como para
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 se está comprobando.
Al leer la fuente de D3.js vi
x >= x
patrón.
Si es para detectar NaNs entre números, ¿por qué no solo
isNaN(x)
o
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;
};
Según mis investigaciones, se supone que
d3.min
funciona en cualquier tipo de valores que se
d3.min
, no solo en números.
isNaN
solo funcionaría con números.
d3 estaba usando
==
en algún momento.
Este commit
introdujo la prueba
x == x
:
A diferencia de
Math.min
yMath.max
, no tiene sentido devolver infinito negativo o positivo parad3.min
yd3.max
; Las funciones D3 devuelven el valor mínimo de acuerdo con 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 indefinida.
github.com/mbostock/d3/commit/…
cambió
x == x
a
x <= x
(que luego se cambió nuevamente 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 verdadero, peroo <= o
es falso. Por lo tanto, era posible para d3.min, d3.max y d3.extent observar estos valores no ordenables en lugar de ignorarlos como se pretendía. La solución es verificar!(o <= o)
lugar deo == o
.