Numaranın işaretini ( işaret fonksiyonu ) bulmanın önemsiz bir yolu olup olmadığını merak ediyor musunuz?
Bariz olandan daha kısa / daha hızlı / daha zarif çözümler olabilir
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
Kısa cevap!
Bunu kullanın ve güvenli ve hızlı olun (kaynak: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
Sen performans ve tip-Coercing karşılaştırma bakmak isteyebilirsiniz keman
Uzun zaman geçti. Dahası, esas olarak tarihsel nedenlerle.
Sonuçlar
Şimdilik şu çözümlere sahibiz:
1. Açık ve hızlı
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. Kbec'den değişiklik - bir tür daha az, daha yüksek performanslı, daha kısa [en hızlı]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
Dikkat: sign("0") -> 1
2. Zarif, kısa, o kadar hızlı değil [en yavaş]
function sign(x) { return x && x / Math.abs(x); }
uyarıyoruz: sign(+-Infinity) -> NaN
,sign("0") -> NaN
İtibariyle Infinity
bu çözüm tam doğru görünmüyor JS yasal sayıdır.
3. Sanat ... ama çok yavaş [en yavaş]
function sign(x) { return (x > 0) - (x < 0); }
4. Bit-shift hızlı kullanmak
, ancaksign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. Tür açısından güvenli [megafast]
! Görünüşe göre tarayıcılar (özellikle Chrome'un v8'i) bazı sihirli optimizasyonlar yapıyor ve bu çözüm, 2 ekstra işlem içermesine ve mantıksal olarak hiçbir zaman daha hızlı olamamasına rağmen (1.1) 'den bile çok daha iyi performans gösteriyor.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Araçlar
İyileştirmelere açığız!
[Offtopic] Kabul edilen cevap
Andrey Tarantsov - Sanat için +100, ama ne yazık ki bariz yaklaşımdan yaklaşık 5 kat daha yavaş
Frédéric Hamidi - bir şekilde en çok oylanan cevap (yazarken) ve biraz havalı, ama kesinlikle işlerin nasıl yapılması gerektiği değil, imho. Ayrıca, aynı zamanda sayı olan Sonsuzluk sayılarını da doğru şekilde işlemez.
kbec - bariz çözümün bir geliştirmesidir. O kadar devrimci değil, ama hep birlikte ele aldığımda bu yaklaşımı en iyisi olarak görüyorum. Ona oy verin :)
0
özel bir durumdur