숫자 부호 ( signum 함수 ) 를 찾는 사소한 방법이 있는지 궁금 하십니까?
명백한 것보다 짧거나 빠르거나 우아한 솔루션 일 수 있습니다.
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
짧은 답변!
이것을 사용하면 안전하고 빠를 것입니다 (출처 : moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
성능 및 유형 강제 비교 바이올린 을보고 싶을 수 있습니다.
오랜 시간이 지났습니다. 또한 주로 역사적 이유 때문입니다.
결과
지금은 다음과 같은 솔루션이 있습니다.
1. 명확하고 빠름
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. kbec 에서 수정 -한 가지 유형은 더 적고 성능이 뛰어나며 짧게 [가장 빠름]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
주의: sign("0") -> 1
2. 우아하고 짧고 빠르지 않음 [가장 느림]
function sign(x) { return x && x / Math.abs(x); }
주의 : sign(+-Infinity) -> NaN
,sign("0") -> NaN
현재 Infinity
JS의 법적 번호는이 솔루션이 완전히 정확하지 않은 것 같습니다.
3. 예술 ...하지만 매우 느림 [가장 느림]
function sign(x) { return (x > 0) - (x < 0); }
4. 빠른 비트 시프트를 사용
하지만sign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. 형식 안전 [megafast]
! 브라우저 (특히 크롬의 v8)가 일부 마법 최적화를 수행하는 것처럼 보이며이 솔루션은 2 개의 추가 작업이 포함되어 있고 논리적으로 결코 더 빠를 수 없음에도 불구하고 (1.1)보다 훨씬 더 성능이 뛰어난 것으로 나타났습니다.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
도구
개선을 환영합니다!
[Offtopic] 수락 된 답변
Andrey Tarantsov- 예술에 +100이지만 슬프게도 명백한 접근 방식보다 약 5 배 느립니다.
Frédéric Hamidi- 어쩐지 가장 많이 찬성 된 답변 (글을 쓰는 동안) 그리고 다소 멋지지만, 일을 어떻게해야하는지 확실히 아니에요, imho. 또한 숫자이기도 한 무한대 숫자를 올바르게 처리하지 못합니다.
kbec- 명백한 솔루션의 개선입니다. 그다지 혁명적이지는 않지만 모두 종합하면이 접근법이 가장 좋다고 생각합니다. 그를 위해 투표하십시오 :)
test everything
버전 을 실행하면 Safe는 특수 값 테스트를 거부하므로 더 빠를 것입니다! only integers
대신 테스트를 실행 해보십시오 . 또한 JSPerf는 그저 자신의 일을하고 있으며 좋아하는 문제가 아닙니다. :)
typeof x === "number"
성능에 마법을 부여 하는 것으로 밝혀졌습니다 . 더 많은 실행, 특히 FF, Opera 및 IE를 명확하게 만드십시오.
Math.sign()
등장하고 크롬으로 곧 출시 될 (0 === 0, "안전"만큼 빠르지 않음)에 대한 새로운 테스트 jsperf.com/signs/7 을 추가했습니다 .
0
특별한 경우라는 것입니다