Saya memiliki serangkaian perhitungan Javascript yang (hanya di bawah IE) menunjukkan Infinity tergantung pada pilihan pengguna.
Bagaimana cara seseorang menghentikan Infinity
kemunculan kata dan misalnya, muncul 0.0
?
javascript
infinity
Homer_J
sumber
sumber
Number.(POSITIVE|NEGATIVE)_INFINITY
alih-alih-?Infinity
atau-?1/0
?Infinity
Properti global bukan hanya-baca yang berarti dapat didefinisikan ulang: Misalnya,var x = 42; Infinity = 42; alert(x === Infinity);
menampilkan "benar" . (Memang itu kasus yang tidak jelas, dan siapa pun yang memutuskan untuk mendefinisikan ulangInfinity
,NaN
dll harus mengharapkan hal-hal aneh terjadi.)Number.(POSITIVE|NEGATIVE)_INFINITY
juga bukan hanya-baca,Infinity
adalah hanya-baca dalam mode ketat. Juga, bagaimana dengan-?1/0
kasus yang saya perlihatkan kepada Anda? Bagaimanapun, Anda hampir selalu harus menggunakanisFinite
.Number.POSITIVE_INFINITY
danNumber.NEGATIVE_INFINITY
yang read-only (diuji pada Chrome8, FF3.6 dan IE8). Menggunakan1/0
berfungsi dengan baik tetapi tidak akan terlalu jelas bagi pengelola kode Anda apa yang sebenarnya Anda coba uji. Saya setuju bahwa menggunakanisFinite
hampir selalu merupakan cara yang lebih baik untuk melakukan sesuatu - itulah mengapa saya menyebutkannya dalam jawaban saya - tetapi hanya OP yang dapat memutuskan apakah itu memenuhi persyaratan mereka.Object.defineProperty
dan__defineGetter__
.Infinity
, Di sisi lain, adalah non-dikonfigurasi dalam mode ketat.Sederhana
n === n+1
ataun === n/0
bekerja:Ketahuilah bahwa native
isFinite()
memaksa input ke angka.isFinite([])
danisFinite(null)
keduanyatrue
sebagai contoh.sumber
n === n+1
mengevaluasi ke true untuk semua bilangan yang lebih besar dari 2 ^ 53, yaitu, 1e30. Peretasan divisi berfungsi, bahkan untuk NaN dan -Infinity. Namun, jawaban LukeH memberi Anda kode yang lebih mudah dibaca.n+1
tidak dapat direpresentasikan dan dapat dibulatkan. Nah, bahkan bilangan bulat dipengaruhi oleh kesalahan pembulatan. Ngomong-ngomong, menurut saya kode Anda tidak "tahan matematika", coba sajan === n/-0
. Saat melengkapi real dengan +/- inf, batas Anda tidak terdefinisi dengan baik kecuali urutan nol yang mendasarinya diasumsikan positif.Di
ES6
,Number.isFinite()
Metode menentukan apakah nilai yang diteruskan adalah bilangan terbatas.sumber
Sebenarnya n === n + 1 akan bekerja untuk angka yang lebih besar dari 51 bit, misalnya
sumber
Saya suka menggunakan Lodash untuk berbagai alasan pengkodean pertahanan serta keterbacaan. ES6
Number.isFinite
bagus dan tidak memiliki masalah dengan nilai non-numerik, tetapi jika ES6 tidak memungkinkan, Anda sudah memiliki lodash, atau menginginkan kode yang lebih singkat: _.isFinitesumber
Saya telah mengalami skenario yang mengharuskan saya untuk memeriksa apakah nilainya dari tipe
NaN
atauInfinity
tetapi meneruskan string sebagai hasil yang valid. Karena banyak string teks akan menghasilkan positif palsuNaN
, saya telah membuat solusi sederhana untuk mengelak itu:Kode di atas mengubah nilai menjadi string dan memeriksa apakah nilainya benar-benar sama dengan NaN atau Infinity (Anda harus menambahkan case lain untuk infinity negatif).
Begitu:
sumber
NaN
s, dll.toString()
? Jangan ragu untuk memberi suara negatif atau menyatakan alasan bagaimana hal ini dapat memberikan hasil yang tidak konsisten atau mengapa metode ini tidak disarankan. Sejauh ini, saya masih merasa ini menambahkan opsi bagi siapa pun yang mencari jawaban dan tidak ada alasan konkret mengapa ini berbahaya, tidak stabil, dll.Anda dapat menggunakan isFinite di jendela,
isFinite(123)
:Anda dapat menulis fungsi seperti:
Dan gunakan seperti:
Anda juga dapat
Number.isFinit
e yang juga memeriksa apakah nilainya juga Angka dan lebih akurat untuk memeriksaundefined
dannull
lain - lain ...Atau Anda dapat mengisinya seperti ini:
sumber