Frage mich, ob es nicht triviale Möglichkeiten gibt, das Vorzeichen einer Zahl zu finden ( Signum-Funktion )?
Kann kürzer / schneller / eleganter sein als die offensichtliche
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
Kurze Antwort!
Verwenden Sie dies und Sie werden sicher und schnell sein (Quelle: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
Sie können an Leistung und Typ-Nötigung Vergleich aussehen wollen Geige
Lange Zeit ist vergangen. Weiter ist vor allem aus historischen Gründen.
Ergebnisse
Im Moment haben wir diese Lösungen:
1. Offensichtlich und schnell
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. Modifikation von kbec - ein Typ weniger, leistungsfähiger, kürzer [am schnellsten]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
Vorsicht: sign("0") -> 1
2. Elegant, kurz, nicht so schnell [am langsamsten]
function sign(x) { return x && x / Math.abs(x); }
Vorsicht : sign(+-Infinity) -> NaN
,sign("0") -> NaN
Da Infinity
es sich bei JS um eine legale Nummer handelt, scheint diese Lösung nicht vollständig korrekt zu sein.
3. Die Kunst ... aber sehr langsam [am langsamsten]
function sign(x) { return (x > 0) - (x < 0); }
4. Verwenden Sie Bit-Shift
schnell, abersign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. Typ-safe [megafast]
! Es scheint, als würden Browser (insbesondere Chrome v8) einige magische Optimierungen vornehmen, und diese Lösung ist viel leistungsfähiger als andere, selbst als (1.1), obwohl sie zwei zusätzliche Vorgänge enthält und logischerweise niemals schneller sein kann.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Werkzeuge
- jsperf-Leistungstests ;
- Geige - Typ-Cast-Tests;
Verbesserungen sind willkommen!
[Offtopic] Akzeptierte Antwort
Andrey Tarantsov - +100 für die Kunst, aber leider ist es ungefähr 5 mal langsamer als der offensichtliche Ansatz
Frédéric Hamidi - irgendwie die am besten bewertete Antwort (für die Zeit des Schreibens) und es ist ein bisschen cool, aber es ist definitiv nicht so, wie Dinge gemacht werden sollten, imho. Außerdem werden Infinity-Zahlen, die auch Zahlen sind, nicht richtig verarbeitet.
kbec - ist eine Verbesserung der offensichtlichen Lösung. Nicht so revolutionär, aber zusammengenommen halte ich diesen Ansatz für den besten. Stimmen Sie für ihn :)
test everything
Version ausführen , weigert sich Safe natürlich, die speziellen Werte zu testen, sodass sie schneller sind! Versuchen Sie only integers
stattdessen , den Test auszuführen. Außerdem macht JSPerf nur seinen Job, es geht nicht darum, ihn zu mögen. :)
typeof x === "number"
die Leistung etwas magischer wird. Bitte machen Sie mehr Läufe, insbesondere FF, Opera und IE, um es klar zu machen.
Math.sign()
(0 === 0, nicht so schnell wie "Sicher") hinzugefügt, der in FF25 erschien und in Chrom erscheint.
0
ein Sonderfall ist