Ti chiedi se ci sono modi non banali per trovare il segno del numero ( funzione segno )?
Possono essere soluzioni più brevi / veloci / più eleganti di quella ovvia
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
Risposta breve!
Usa questo e sarai sicuro e veloce (fonte: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
Potresti voler guardare le prestazioni e il violino di confronto del tipo
È passato molto tempo. Inoltre è principalmente per ragioni storiche.
risultati
Per ora abbiamo queste soluzioni:
1. Ovvio e veloce
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. Modifica da kbec : un tipo lanciato in meno, più performante, più corto [il più veloce]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
attenzione: sign("0") -> 1
2. Elegante, corto, non così veloce [il più lento]
function sign(x) { return x && x / Math.abs(x); }
Attenzione: sign(+-Infinity) -> NaN
,sign("0") -> NaN
Poiché Infinity
è un numero legale in JS, questa soluzione non sembra completamente corretta.
3. L'arte ... ma molto lenta [più lenta]
function sign(x) { return (x > 0) - (x < 0); }
4. Utilizzando bit-shift
veloce, masign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. Type-safe [megafast]
! Sembra che i browser (in particolare il v8 di Chrome) effettuino alcune magiche ottimizzazioni e questa soluzione risulta essere molto più performante di altre, anche della (1.1) nonostante contenga 2 operazioni extra e logicamente non potrà mai essere più veloce.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Utensili
I miglioramenti sono i benvenuti!
[Offtopic] Risposta accettata
Andrey Tarantsov - +100 per l'arte, ma purtroppo è circa 5 volte più lento dell'approccio ovvio
Frédéric Hamidi - in qualche modo la risposta più votata (per il momento in cui scrivo) ed è piuttosto interessante, ma sicuramente non è come dovrebbero essere fatte le cose, imho. Inoltre non gestisce correttamente i numeri Infinity, che sono anche numeri, sai.
kbec - è un miglioramento della soluzione ovvia. Non così rivoluzionario, ma considerando tutto insieme considero questo approccio il migliore. Votalo :)
test everything
versione, Safe si rifiuterà di testare i valori speciali, quindi sarà più veloce! Prova invece a eseguire il only integers
test. Inoltre, JSPerf sta solo facendo il suo lavoro, non è questione di piacergli. :)
typeof x === "number"
mette un po 'di magia su performace. Per favore, fai più run, specialmente FF, Opera e IE per renderlo più chiaro.
Math.sign()
(0 === 0, non veloce come "Safe") che è apparso in FF25 ed è in arrivo su Chrome.
0
è un caso speciale