Bertanya-tanya apakah ada cara nontrivial untuk menemukan tanda bilangan ( fungsi signum )?
Mungkin solusi yang lebih pendek / lebih cepat / lebih elegan daripada yang sudah jelas
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
Jawaban singkat!
Gunakan ini dan Anda akan aman dan cepat (sumber: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
Anda mungkin ingin melihat kinerja dan biola perbandingan pemaksaan tipe
Waktu sudah lama berlalu. Lebih lanjut terutama karena alasan sejarah.
Hasil
Untuk saat ini kami memiliki solusi ini:
1. Jelas dan cepat
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. Modifikasi dari kbec - satu jenis lebih sedikit, lebih berkinerja, lebih pendek [tercepat]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
peringatan: sign("0") -> 1
2. Elegan, pendek, tidak terlalu cepat [paling lambat]
function sign(x) { return x && x / Math.abs(x); }
hati-hati: sign(+-Infinity) -> NaN
,sign("0") -> NaN
Pada Infinity
nomor resmi di JS, solusi ini tampaknya tidak sepenuhnya benar.
3. Seni ... tapi sangat lambat [paling lambat]
function sign(x) { return (x > 0) - (x < 0); }
4. Menggunakan bit-shift
cepat, tapisign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. Aman untuk mengetik [megafast]
! Sepertinya browser (terutama chrome v8) membuat beberapa optimasi ajaib dan solusi ini ternyata jauh lebih berkinerja daripada yang lain, bahkan daripada (1.1) meskipun berisi 2 operasi tambahan dan secara logis tidak pernah bisa lebih cepat.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Alat
Perbaikan dipersilakan!
[Offtopic] Jawaban yang diterima
Andrey Tarantsov - +100 untuk seni, tapi sayangnya itu sekitar 5 kali lebih lambat dari pendekatan yang sudah jelas
Frédéric Hamidi - entah bagaimana jawaban yang paling disukai (untuk saat ini menulis) dan itu agak keren, tapi jelas bukan bagaimana hal-hal harus dilakukan, imho. Juga tidak menangani nomor Infinity dengan benar, yang juga merupakan angka, lho.
kbec - adalah perbaikan dari solusi yang sudah jelas. Tidak terlalu revolusioner, tetapi secara keseluruhan saya menganggap pendekatan ini sebagai yang terbaik. Pilih dia :)
test everything
versi tersebut, Safe akan menolak untuk menguji nilai-nilai khusus, jadi akan lebih cepat! Coba jalankan only integers
pengujian sebagai gantinya. Selain itu, JSPerf hanya melakukan tugasnya, bukan tentang menyukainya. :)
typeof x === "number"
memberikan keajaiban pada kinerja. Tolong, buat lebih banyak berjalan, terutama FF, Opera dan IE untuk membuatnya jelas.
Math.sign()
(0 === 0, tidak secepat "Aman") yang muncul di FF25 dan akan datang di chrome.
0
adalah kasus khusus