Number.sign () in Javascript

Frage mich, ob es irgendwelche nicht-triviale Wege zu finden, die Anzahl der Zeichen (signum-Funktion)?
Kann sein, kürzere /schnellere /elegantere Lösungen als die offensichtliche

var sign = number > 0 ? 1 : number < 0 ? -1 : 0;

Kurzer Auszug

Verwenden Sie diese und Sie werden schnell und sicher

function sign(x) {
    return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}

Ergebnisse

Für jetzt haben wir diese Lösungen:


1. Offensichtlich und schnell

function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }

1.1. Änderung von kbec - eine Art cast-weniger, schneller, kürzer [Schnellste]

function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }

Vorsicht: sign("0") -> 1


2. Elegante, kurze, nicht so schnell [langsamsten]

function sign(x) { return x && x / Math.abs(x); }

Vorsicht: sign(+-Infinity) -> NaNsign("0") -> NaN

Als der Infinity ist eine juristische Zahl in JS diese Lösung scheint nicht ganz korrekt.


3. Die Kunst... aber sehr langsam [langsamsten]

function sign(x) { return (x > 0) - (x < 0); }

4. Unter Verwendung von bit-shift
schnell, aber sign(-Infinity) -> 0

function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }

5. Typ-sicher [megafast]

! Scheint, wie Browser (vor allem chrome ' s v8) machen Sie einige Magische Optimierungen und diese Lösung stellt sich heraus, dass sehr viel leistungsfähiger als andere, auch als (1.1), obwohl es enthält 2 zusätzliche Operationen und logischerweise nie kann nicht schneller sein.

function sign(x) {
    return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}

Tools

Verbesserungen sind willkommen!


[Offtopic] Akzeptierte Antwort

  • Andrey Tarantsov - +100 für die Kunst, aber leider es ist etwa 5-mal langsamer als die offensichtliche Ansatz
  • Frédéric Hamidi - irgendwie sind die meisten von Ihnen positiv bewertet werden Antwort (für die Zeit zu schreiben) und es ist echt cool, aber es ist definitiv nicht so, wie die Dinge getan werden sollte, imho. Auch ist es nicht richtig verarbeiten Infinity-zahlen, die auch zahlen, wissen Sie.
  • kbec - ist eine Verbesserung der offensichtlichen Lösung. Nicht Revolutionär, aber alles zusammen halte ich diesen Ansatz am besten. Für ihn Stimmen 🙂

InformationsquelleAutor der Frage |

Schreibe einen Kommentar