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
?
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;
};
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
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 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, peroo <= 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 deo == o
.
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.
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