javascript - ejemplos - Diferenciar+0 y-0
javascript html (8)
Como la gente parece perpleja en cuanto a cuál sería la necesidad práctica de esto: aquí está mi caso de uso ...
Necesitaba una solución para ordenar las columnas de una tabla por su índice. Haga clic en <th>
e invoque el clasificador con [ordinal] para ascender y - [ordinal] para descender. La primera columna daría -0
para descender o 0
para ascender.
Entonces necesito diferenciar entre +0
y -0
y terminé aquí. La solución que funcionó para mí está en el comentario de @ Šime Vidas, pero está algo escondida.
// This comparison works for all negatives including -0
if ( 1 / x > 0 ) { }
1 / -0 > 0 // false
1 / 0 > 0 // true
1 / -99 > 0 // false
1 / 99 > 0 // true
// WRONG: this naive comparison might give unexpected results
if ( x > 0 ) { }
-0 > 0 // true
// Gotcha
Resulta que +0 === -0
evalúa como true
pesar de que +0
y -0
son entidades diferentes . Entonces, ¿cómo diferenciar +0
de -0
?
Hay un truco:
if (1 / myZero > 0) {
// myZero is +0
} else {
// myZero is -0
}
¿Puedo hacerlo mejor?
Como lo insinuó Matt Fenwick, podrías hacer (usando el var zero
):
if(1/zero===Infinity) {
// zero is +0
} else {
// zero is -0
}
De acuerdo con el libro de David Flanagan, p. 34 , dividiendo 1 por su cero producirá el infinito correspondiente, que luego se puede usar en una verificación de igualdad:
1 / 0
> Infinity
1 / -0
> -Infinity
Y aquí está el comportamiento de las comparaciones de igualdad de infinitos:
Infinity === -Infinity
> false
Infinity === Infinity
> true
-Infinity === Infinity
> false
-Infinity === -Infinity
> true
En ECMAScript 6 Object.is
comporta como ===
excepto que distingue ceros positivos y negativos, y Object.is(NaN, NaN)
evalúa como true
. (Vea here para una reseña).
Chrome 24 es compatible con Object.is
.
Esto devuelve +0:
-0 + 0
Esto no ayuda a diferenciar -0 y +0, pero esto ayuda a asegurar que algún valor no sea -0.
1 / -0 => -Infinity
1 / (-0 + 0) => Infinity
Esto sigue siendo un tipo de truco, pero un vistazo a las especificaciones sugiere esto:
Math.atan2(0, -0) === Math.PI // true
Math.atan2(0, 0) === 0 // true
Para verificar el cero negativo, aquí hay una solución simple.
function isNegativeZero(n) {
n = Number( n );
return (n === 0) && (1 / n === -Infinity);
}
Una opción directa en Node.js es usar Buffer .
var negZero = Buffer(''8000000000000000'', ''hex'')
var buf = Buffer(8);
buf.writeDoubleBE(myZero);
if (buf.equals(negZero)) {
// myZero is -0
} else {
// myZero is +0
}
Además, puede navegar fácilmente por ellos mediante un módulo de memoria intermedia .