espaƱol ejemplos descargar definicion curso caracteristicas javascript

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 .