2015-07-23 17 views
24

Sto usando MomentJS per calcolare la differenza tra due volte. La cosa strana riguarda questa libreria: la differenza tra oggi e oggi è 0. La differenza tra oggi e domani è -0.JavaScript - Rilevamento della differenza tra zero positivo e zero negativo

La mia domanda è, come faccio a distinguere tra 0 e -0. Sembra che JavaScript li tratti lo stesso.

Così, per esempio se scrivo il seguente codice:

if (tomorrow === -0) 
    console.log('It is tomorrow!'); 
else if (tomorrow === 0) 
    console.log('It is today!'); 

Ecco un esempio su JSFiddle da come gestisce i valori restituiti (io sono in Australia così a seconda di dove ci si trova la parola si può è necessario modificare le date di oggi e di domani)

+2

Per me, 'tomorrow' viene visualizzato come' -1', non '-0'. (via il tuo violino) – Pointy

+0

su 0 e -0 problema, puoi dare un'occhiata a questo http://stackoverflow.com/questions/7223359/are-0-and-0-the-same – cycopepe

+1

Dove sei, come fisicamente sul pianeta terra in questo momento? – Pointy

risposta

46

1/val > 0 farà quello che vuoi. Restituisce true per il positivo e false per il negativo.

Questo funziona perché 1/-0 restituisce infinito negativo e 1/0 restituisce infinito positivo, che sono quindi comparabili. Potresti anche fare qualcosa come 1/val == Infinity.

11

Come indicato in this Stack Overflow question (e nei commenti), in JavaScript +0 === -0 in effetti valuta true in base alla progettazione.

È possibile utilizzare Infinity/-Infinity di vedere una differenza (tecnicamente, +0/-0 potrebbero non essere gli unici numeri per produrre valori infiniti, così ho lasciato l'ulteriore controllo in):

var positiveZero = +0; 
var negativeZero = -0; 

console.log(positiveZero === 0 && 1/positiveZero === Infinity); // true 
console.log(positiveZero === 0 && 1/positiveZero === -Infinity); // false 

console.log(negativeZero === 0 && 1/negativeZero === Infinity); // false 
console.log(negativeZero === 0 && 1/negativeZero === -Infinity); // true 

JSFiddle

Vedere anche this blog post per maggiori dettagli e un'altra soluzione con ECMAScript 5:

function isNegative0(x) { 
    if (x!==0) return false; 
    var obj=Object.freeze({z:-0}); 
    try { 
     Object.defineProperty(obj,'z',{value:x}); 
    } catch (e) {return false}; 
    return true; 
} 
Problemi correlati