Hanya karena penasaran.
Tampaknya tidak terlalu logis yaitu typeof NaN
angka. Ngomong -ngomong NaN === NaN
atau NaN == NaN
membalas salah, omong-omong. Apakah ini salah satu kekhasan javascript, atau akankah ada alasan untuk ini?
Sunting: terima kasih atas jawaban Anda. Ini bukan hal yang mudah untuk membuat orang berkeliaran. Membaca jawaban dan wiki saya lebih mengerti, tapi tetap saja kalimatnya seperti
Perbandingan dengan NaN selalu mengembalikan hasil yang tidak terurut bahkan ketika membandingkan dengan itu sendiri. Predikat perbandingan adalah pensinyalan atau non-pensinyalan, versi pensinyalan menandakan pengecualian yang tidak valid untuk perbandingan semacam itu. Predikat persamaan dan persamaan adalah non-pensinyalan sehingga x = x false dapat digunakan untuk menguji apakah x adalah NaN yang sunyi.
hanya membuat kepalaku berputar. Jika seseorang dapat menerjemahkan ini dalam bahasa yang dapat dibaca manusia (berbeda dengan, katakanlah, ahli matematika), saya akan berterima kasih.
sumber
isNumeric
memeriksa jenis:$.isNumeric(NaN);
mengembalikan false, di mana$.type(NaN);
, mengembalikan nomor. api.jquery.com/jQuery.isNumericJawaban:
Artinya Bukan Angka. Ini bukan kekhasan javascript tetapi prinsip ilmu komputer yang umum.
Dari http://en.wikipedia.org/wiki/NaN :
Semua nilai ini mungkin tidak sama. Tes sederhana untuk NaN adalah menguji
value == value
salah.sumber
isNaN(value)
isNaN(undefined)
kembalitrue
, tetapiundefined == undefined
juga benar. Hal yang sama berlaku untuk semua jenis non-angka lain kecualinull
.value !== value
mungkin merupakan cara terpendek untuk menguji apakahvalue
benarNaN
.Yah,
NaN
masih tipe numerik , meskipun sebenarnya singkatan dari Not-A-Number :-)NaN
hanya berarti nilai spesifik tidak dapat direpresentasikan dalam batasan tipe numerik (walaupun itu bisa dikatakan untuk semua angka yang harus dibulatkan agar pas, tetapiNaN
merupakan kasus khusus).Spesifik
NaN
tidak dianggap sama dengan yang lainNaN
karena mereka mungkin nilai yang berbeda. Namun,NaN
masih merupakan tipe angka, sama seperti 2718 atau 31415.Mengenai pertanyaan Anda yang diperbarui untuk dijelaskan dalam istilah awam:
Semua ini berarti (dipecah menjadi beberapa bagian):
Pada dasarnya, a
NaN
tidak sama dengan nomor lain, termasuk nomor lainNaN
, dan bahkan termasuk nomor itu sendiri .Mencoba melakukan perbandingan (kurang dari, lebih besar dari, dan sebagainya) operasi antara a
NaN
dan nomor lain dapat menghasilkan pengecualian yang dilemparkan (pensinyalan) atau hanya menjadi salah sebagai hasilnya (non-pensinyalan atau diam).Tes untuk kesetaraan (sama dengan, tidak sama dengan) tidak pernah memberi sinyal sehingga menggunakannya tidak akan menyebabkan pengecualian. Jika Anda memiliki nomor reguler
x
, makax == x
akan selalu benar. Jikax
aNaN
, makax == x
akan selalu salah. Ini memberi Anda cara untuk mendeteksiNaN
dengan mudah (diam-diam).sumber
typeof a === 'number'
berarti "a disimpan secara internal sebagai pelampung IEEE 754"Infinity === Infinity
kembalitrue
jika suatuInfinity
dapat diproduksi oleh nilai yang berbeda: 1.0 / 0.0 atau 2.0 / 0.0?1/0
dan2/0
berbaring di kelas yang sama dan (2) hanya ada satu kelas infinity di IEEE754 (selain+/-
tentu saja).0/0
tidak didefinisikan dengan cara yang berarti, selain mengatakan "nilainya" adalah seluruh rangkaian angka. Dan bahkan jika mereka didefinisikan,Math.log(-1) == Math.log(-1)
masih dievaluasifalse
. Jadi tidak hanya tidak ada "angka aktual" selainNaN
tetapi bahkan jika ada, mereka tidak digunakan untuk perbandingan.ECMAScript (JavaScript) menspesifikasikan standar yang
Numbers
adalah IEEE 754 mengapung, yang meliputiNaN
sebagai nilai mungkin.sumber
typeof NaN
kembali'number'
karena:ECMAScript spec mengatakan tipe Number termasuk NaN:
Jadi
typeof
kembalilah sesuai:Perilaku ini sesuai dengan Standar IEEE untuk Aritmatika Floating-Point (IEEE 754) :
sumber
NaN adalah nilai floating point yang valid ( http://en.wikipedia.org/wiki/NaN )
dan NaN === NaN salah karena mereka tidak harus non-angka yang sama
sumber
Infinity
itu identik? Adakah pikiran?NaN != NaN
karena mereka tidak perlu SAMA non-angka. Jadi itu masuk akal ... Juga mengapa mengapung memiliki keduanya +0,00 dan -0,00 yang tidak sama. Pembulatan dapat melakukan itu mereka sebenarnya tidak nol.Adapun typeof, itu tergantung pada bahasa. Dan sebagian besar bahasa akan mengatakan bahwa NaN adalah float, double atau angka tergantung pada bagaimana mereka mengklasifikasikannya ... Saya tahu tidak ada bahasa yang akan mengatakan ini adalah tipe yang tidak diketahui atau nol.
sumber
number
,NaN
primitif, dan karenanya secara unik ditentukan oleh nilainya.NaN
singkatan Not a Number . Ini adalah nilai tipe data numerik (biasanya tipe floating point, tetapi tidak selalu) yang mewakili hasil operasi yang tidak valid seperti membagi dengan nol.Meskipun namanya mengatakan itu bukan angka, tipe data yang digunakan untuk menyimpannya adalah tipe numerik. Jadi dalam JavaScript, meminta datatype
NaN
akan kembalinumber
(seperti yangalert(typeof(NaN))
ditunjukkan dengan jelas).sumber
Infinity
tidakNaN
Javascript menggunakan NaN untuk mewakili apa pun yang dihadapinya yang tidak dapat direpresentasikan dengan cara lain dengan spesifikasinya. Itu tidak berarti itu bukan angka. Itu hanya cara termudah untuk menggambarkan pertemuan itu. NaN berarti bahwa itu atau objek yang merujuknya tidak dapat diwakili dengan cara lain dengan javascript. Untuk semua tujuan praktis, ini 'tidak dikenal'. Menjadi 'tidak dikenal' itu tidak bisa memberi tahu Anda apa itu atau bahkan jika itu sendiri. Bahkan bukan objek yang ditugaskan padanya. Ini hanya bisa memberi tahu Anda apa yang bukan, dan tidak ada atau tidak ada hanya dapat dijelaskan secara matematis dalam bahasa pemrograman. Karena matematika adalah tentang angka, javascript mewakili ketiadaan sebagai NaN. Itu tidak berarti itu bukan angka. Itu berarti kita tidak bisa membacanya dengan cara lain yang masuk akal. Itu sebabnya bisa ' bahkan tidak sama dengan dirinya sendiri. Karena tidak.
sumber
Nama yang lebih baik untuk
NaN
, menggambarkan maknanya lebih tepat dan kurang membingungkan, akan menjadi pengecualian numerik . Ini benar-benar jenis pengecualian objek lain yang menyamar sebagai memiliki tipe primitif (oleh desain bahasa), di mana pada saat yang sama ia tidak diperlakukan sebagai primitif dalam perbandingan diri yang salah. Dari mana kebingungan. Dan selama bahasa "tidak akan mengambil keputusan" untuk memilih antara objek pengecualian yang tepat dan bilangan primitif , kebingungan akan tetap ada.Ketidaksamaan yang terkenal
NaN
itu sendiri, keduanya==
dan===
merupakan manifestasi dari desain yang membingungkan memaksa objek pengecualian ini menjadi tipe primitif. Ini mematahkan prinsip fundamental bahwa primitif secara unik ditentukan oleh nilainya . JikaNaN
lebih disukai dilihat sebagai perkecualian (yang bisa ada jenisnya berbeda), maka itu tidak boleh "dijual" sebagai primitif. Dan jika ingin menjadi primitif, prinsip itu harus dipegang. Selama itu rusak, seperti yang kita miliki dalam JavaScript, dan kita tidak bisa benar-benar memutuskan di antara keduanya, kebingungan yang mengarah pada beban kognitif yang tidak perlu bagi semua orang yang terlibat akan tetap ada. Namun, yang sangat mudah diperbaiki dengan hanya membuat pilihan di antara keduanya:NaN
objek pengecualian khusus yang berisi informasi berguna tentang bagaimana pengecualian muncul, sebagai lawan membuang informasi itu seperti apa yang saat ini diterapkan, yang mengarah ke kode yang lebih sulit untuk debug;NaN
suatu entitas dari tipe primitifnumber
(yang bisa kurang membingungkan disebut "numerik"), dalam hal ini harus sama dengan dirinya sendiri dan tidak dapat berisi informasi lain; yang terakhir jelas merupakan pilihan yang lebih rendah.Satu-satunya keuntungan dari memaksakan
NaN
ke dalamnumber
tipe adalah dapat membuangnya kembali ke ekspresi numerik apa pun. Namun, yang membuatnya menjadi pilihan yang rapuh, karena hasil dari setiap ekspresi numerik yang mengandungNaN
akan menjadiNaN
, atau mengarah ke hasil yang tidak dapat diprediksi sepertiNaN < 0
mengevaluasifalse
, yaitu mengembalikanboolean
alih-alih menjaga pengecualian.Dan bahkan jika "segala sesuatunya seperti itu", tidak ada yang menghalangi kita untuk membuat perbedaan yang jelas untuk diri kita sendiri, untuk membantu membuat kode kita lebih mudah diprediksi dan lebih mudah disangkal. Dalam praktiknya, itu berarti mengidentifikasi pengecualian-pengecualian itu dan menanganinya sebagai pengecualian. Yang, sayangnya, berarti lebih banyak kode tetapi mudah-mudahan akan dikurangi dengan alat seperti TypeScript dari Flowtype.
Dan kemudian kita memiliki berantakan tenang vs berisik alias sinyal
NaN
perbedaan . Yang benar-benar adalah tentang bagaimana pengecualian ditangani, bukan pengecualian itu sendiri, dan tidak ada yang berbeda dari pengecualian lainnya.Demikian pula,
Infinity
dan+Infinity
elemen-elemen tipe numerik yang muncul dalam ekstensi garis nyata tetapi mereka bukan bilangan real. Secara matematis, mereka dapat diwakili oleh urutan bilangan real yang konvergen ke salah satu+
atau-Infinity
.sumber
Ini hanya karena
NaN
merupakan properti dari objek Number di JS, Ini tidak ada hubungannya dengan itu menjadi nomor.sumber
Number.fu = "bar"; alert(typeof Number.fu);
NaN
bukan nilai yang disimpanNumber.NaN
, apa pun itu.NaN
adalah nilai primitif dari tipe Number. Dan tambahannya, nilainyaNumber.NaN
adalahNaN
, tetapi itu tidak berhubungan.Cara terbaik untuk berpikir tentang NAN adalah tidak dikenal . Itulah mengapa NAN! = NAN karena setiap nilai NAN mewakili beberapa angka unik yang tidak dikenal. NAN diperlukan karena angka floating point memiliki rentang nilai yang terbatas. Dalam beberapa kasus pembulatan terjadi di mana bit yang lebih rendah hilang yang mengarah pada apa yang tampak seperti omong kosong seperti 1.0 / 11 * 11! = 1.0. Nilai yang benar-benar besar yang lebih besar adalah NAN dengan infinity sebagai contoh sempurna.
Mengingat kami hanya memiliki sepuluh jari, upaya apa pun untuk menunjukkan nilai yang lebih besar dari 10 adalah mustahil, yang berarti nilai tersebut harus berupa NAN karena kami telah kehilangan nilai sebenarnya dari nilai lebih besar dari 10 ini. Hal yang sama berlaku untuk nilai floating point, di mana nilainya melebihi batas dari apa yang dapat disimpan dalam float.
sumber
Karena NaN adalah tipe data numerik.
sumber
NaN
adalah angka dari sudut pandang jenis, tetapi bukan angka normal seperti 1, 2 atau 329131. Nama "Bukan Angka" mengacu pada fakta bahwa nilai yang diwakili adalah spesial dan tentang domain spesifikasi format IEEE, bukan domain bahasa javascript.sumber
Jika menggunakan jQuery, saya lebih suka
isNumeric
memeriksa jenis:http://api.jquery.com/jQuery.isNumeric/
sumber
isNumber
dariutil
paket naskah. Bagus bahwa kami masih menggunakanjQuery
proyek kami jadi gunakan saran Anda sebagai gantinya.isNumber
dariutil
naskah juga kembalitrue
untukNaN
.Javascript hanya memiliki satu tipe data numerik, yang merupakan float presisi ganda 64-bit standar. Semuanya ganda. NaN adalah nilai spesial ganda, tetapi tetap ganda.
Yang perlu
parseInt
dilakukan hanyalah "membuang" string Anda ke dalam tipe data numerik, sehingga hasilnya selalu "angka"; hanya jika string asli tidak dapat diuraikan, nilainya akan menjadi NaN.sumber
NaN masih merupakan tipe numerik, tetapi itu mewakili nilai yang tidak bisa mewakili angka yang valid.
sumber
Kita dapat berargumen bahwa NaN adalah objek kasus khusus. Dalam hal ini, objek NaN mewakili angka yang tidak masuk akal secara matematis. Ada beberapa objek kasus khusus lainnya dalam matematika seperti INFINITE dan sebagainya.
Anda masih dapat melakukan beberapa perhitungan dengan itu, tetapi itu akan menghasilkan perilaku aneh.
Info lebih lanjut di sini: http://www.concentric.net/~ttwang/tech/javafloat.htm (berbasis java, bukan javascript)
sumber
Anda harus menyukai Javascript. Ini memiliki beberapa kebiasaan kecil yang menarik.
http://wtfjs.com/page/13
Sebagian besar kebiasaan itu dapat dijelaskan jika Anda berhenti mengerjakannya secara logis, atau jika Anda tahu sedikit tentang teori bilangan, tetapi mereka tetap bisa menangkap Anda jika Anda tidak mengetahuinya.
Ngomong-ngomong, saya sarankan membaca sisa http://wtfjs.com/ - ada banyak kebiasaan yang lebih menarik daripada yang ditemukan!
sumber
Nilai NaN adalah benar-benar Number.NaN maka ketika Anda bertanya apakah itu nomor itu akan mengatakan ya. Anda melakukan hal yang benar dengan menggunakan panggilan isNaN ().
Sebagai informasi, NaN juga dapat dikembalikan oleh operasi pada Numbers yang tidak didefinisikan seperti divisi dengan nol atau akar kuadrat dari angka negatif.
sumber
NaN == Number.NaN
mengevaluasi kefalse
!NaN==NaN
makhluk bodoh itufalse
, pastilah sadis yang menemukan itu untuk membuat semua orang menderita.Sebuah contoh
Bayangkan Kami mengonversi string ke angka:
Kami mengubah tipe data menjadi angka tetapi nilainya bukan angka!
sumber
NaN
adalah dari jenis nomor . Pertanyaannya adalah bertanya mengapa.Ini adalah nilai khusus tipe Angka sebagai POSITIVE_INFINITY
Mengapa? Dengan desain
sumber