Ciekawe, czy są jakieś nietrywialne sposoby znalezienia znaku liczby ( funkcja signum )?
Mogą być krótsze / szybsze / bardziej eleganckie rozwiązania niż oczywiste
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
Krótka odpowiedź!
Użyj tego, a będziesz bezpieczny i szybki (źródło: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
Możesz przyjrzeć się skrzypcom porównawczym wydajności i wymuszania typu
Minęło dużo czasu. Dalej jest głównie ze względów historycznych.
Wyniki
Na razie mamy takie rozwiązania:
1. Oczywiste i szybkie
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. Modyfikacja z kbec - jeden typ rzadziej rzucany, wydajniejszy , krótszy [najszybszy]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
Uwaga: sign("0") -> 1
2. Eleganckie, krótkie, nie tak szybkie [najwolniejsze]
function sign(x) { return x && x / Math.abs(x); }
Ostrzeżenie: sign(+-Infinity) -> NaN
,sign("0") -> NaN
Jak Infinity
na numer prawny w JS, to rozwiązanie nie wydaje się w pełni poprawne.
3. Sztuka ... ale bardzo wolno [najwolniej]
function sign(x) { return (x > 0) - (x < 0); }
4. Używając szybkiego przesunięcia bitowego
, alesign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. Bezpieczne dla typów [megafast]
! Wygląda na to, że przeglądarki (zwłaszcza Chrome v8) dokonują magicznych optymalizacji i to rozwiązanie okazuje się znacznie wydajniejsze niż inne, nawet niż (1.1), mimo że zawiera 2 dodatkowe operacje i logicznie rzecz biorąc, nigdy nie może być szybsze.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Przybory
- testy wydajności jsperf ;
- skrzypce - testy typu cast;
Ulepszenia są mile widziane!
[Offtopic] Zaakceptowana odpowiedź
Andrey Tarantsov - +100 za sztukę, ale niestety jest to około 5 razy wolniejsze niż oczywiste podejście
Frédéric Hamidi - jakoś najbardziej chwalona odpowiedź (jak na razie piszę) i jest całkiem fajna, ale zdecydowanie nie tak należy to robić, imho. Ponadto nie obsługuje poprawnie liczb nieskończoności, które są również liczbami, wiesz.
kbec - to ulepszenie oczywistego rozwiązania. Nie tak rewolucyjne, ale biorąc wszystko razem uważam to podejście za najlepsze. Zagłosuj na niego :)
0
jest to szczególny przypadek