Kode ini di JS memberi saya popup yang mengatakan "saya pikir nol adalah angka", yang menurut saya sedikit mengganggu. Apa yang saya lewatkan?
if (isNaN(null)) {
alert("null is not a number");
} else {
alert("i think null is a number");
}
Saya menggunakan Firefox 3. Apakah itu bug browser?
Tes lain:
console.log(null == NaN); // false
console.log(isNaN("text")); // true
console.log(NaN == "text"); // false
Jadi, masalahnya tampaknya bukan perbandingan yang tepat dengan NaN?
Sunting: Sekarang pertanyaan telah dijawab, saya telah membersihkan posting saya untuk memiliki versi yang lebih baik untuk arsip. Namun, ini membuat beberapa komentar dan bahkan beberapa jawaban sedikit tidak bisa dimengerti. Jangan salahkan penulisnya. Di antara hal-hal yang saya ubah adalah:
- Menghapus sebuah catatan yang mengatakan bahwa saya telah mengacaukan tajuk utama dengan mengembalikan artinya
- Jawaban sebelumnya menunjukkan bahwa saya tidak menyatakan dengan cukup jelas mengapa saya pikir perilaku itu aneh, jadi saya menambahkan contoh yang memeriksa string dan melakukan perbandingan manual.
javascript
Hanno Fietz
sumber
sumber
Jawaban:
Saya yakin kode itu mencoba bertanya, "apakah
x
numerik?" dengan kasus khusus di sinix = null
. FungsiisNaN()
ini dapat digunakan untuk menjawab pertanyaan ini, tetapi secara semantik merujuk secara khusus pada nilainyaNaN
. Dari Wikipedia untukNaN
:Dalam kebanyakan kasus, kami pikir jawaban untuk "adalah angka nol?" seharusnya tidak. Namun,
isNaN(null) == false
secara semantik benar, karenanull
tidakNaN
.Berikut penjelasan algoritmiknya:
Fungsi
isNaN(x)
mencoba untuk mengkonversi parameter yang diteruskan ke angka 1 (setara denganNumber(x)
) dan kemudian menguji apakah nilainyaNaN
. Jika parameter tidak dapat dikonversi ke angka,Number(x)
akan mengembalikanNaN
2 . Oleh karena itu, jika konversi parameterx
ke hasil angkaNaN
, itu mengembalikan true; jika tidak, itu mengembalikan false.Jadi, dalam kasus tertentu
x = null
,null
dikonversi ke angka 0, (coba evaluasiNumber(null)
dan perhatikan bahwa ia mengembalikan 0,) danisNaN(0)
mengembalikan false. String yang hanya digit dapat dikonversi ke angka dan isNaN juga mengembalikan false. String (misalnya'abcd'
) yang tidak dapat dikonversi ke angka akan menyebabkanisNaN('abcd')
true, khususnya karenaNumber('abcd')
returnNaN
.Selain kasus tepi nyata ini adalah alasan numerik standar untuk mengembalikan NaN seperti 0/0.
Adapun tes yang tampaknya tidak konsisten untuk kesetaraan yang ditunjukkan dalam pertanyaan, perilaku
NaN
ditentukan sedemikian rupa sehingga perbandingan apa punx == NaN
salah, terlepas dari operan lainnya, termasukNaN
dirinya sendiri 1 .sumber
NaN !== NaN
,. Jadi, saya pikir, itu tidak sepenuhnya benar untuk mengatakanNumber('abcd') == NaN
karenaNumber('abcd')
ituNaN
tetapi tidak sama denganNaN
. Saya suka JavaScript.Number('abcd')
adalahNaN
tapi saya tersirat bahwa tes benar untuk kesetaraan, yang tidak terjadi. Saya akan mengeditnya.isNaN
danNumber
dirancang untuk berperilaku seperti itu?null
ke0
hanya (setidaknya dalam konteks ini) terjadi di dalamisNaN()
fungsi, yang memaksa argumennya.Saya sendiri mengalami masalah ini.
Bagi saya, cara terbaik untuk menggunakan isNaN adalah seperti itu
isNaN(parseInt(myInt))
mengambil contoh phyzome dari atas,
(Saya menyelaraskan hasilnya sesuai dengan input, harap membuatnya lebih mudah dibaca.)
Ini sepertinya lebih baik bagiku.
sumber
myInt
= "123d".parseInt
mengkonversi "123d" ke 123, yang kemudian gagalisNaN
tes.isNaN(parseInt(str,10)) || isNaN(Number())
. btw - bagi saya, karena saya harus menjalankanparseInt
untuk menggunakan nilai numerik string, yang memungkinkan "123d" dianggap sebagai nomor yang valid baik-baik saja. Namun saya melihat perlunya mendeteksi skenario itu juga.(Komentar saya yang lain mengambil pendekatan praktis. Inilah sisi teoretisnya.)
Saya mencari standar ECMA 262 , yang merupakan implementasi Javascript. Spesifikasi mereka untuk isNan:
Bagian 9.3 menentukan perilaku
ToNumber
(yang bukan merupakan fungsi yang bisa dipanggil, tetapi lebih merupakan komponen dari sistem konversi tipe). Untuk meringkas tabel, tipe input tertentu dapat menghasilkan NaN. Ini adalah tipeundefined
, tipenumber
(tetapi hanya nilaiNaN
), objek apa pun yang representasi primitifnyaNaN
, dan apa punstring
yang tidak dapat diuraikan. Daun iniundefined
,NaN
,new Number(NaN)
, dan sebagian besar string.Setiap input yang menghasilkan
NaN
sebagai output ketika dilewatkan keToNumber
akan menghasilkantrue
ketika diumpankan keisNaN
. Karenanull
dapat berhasil dikonversi ke angka, itu tidak menghasilkantrue
.Dan itu sebabnya.
sumber
Ini memang mengganggu. Berikut ini adalah array nilai yang saya uji:
Ini mengevaluasi (di Firebug console) untuk:
Ketika saya menelepon
x.map(isNaN)
(untuk memanggil isNaN pada setiap nilai), saya mendapatkan:Kesimpulannya,
isNaN
terlihat sangat tidak berguna! ( Sunting : Kecuali ternyata isNaN hanya didefinisikan atas Angka, dalam hal ini berfungsi dengan baik - hanya dengan nama yang menyesatkan.)Secara kebetulan, ini adalah tipe dari nilai-nilai itu:
sumber
Null bukan NaN, juga string bukan NaN. isNaN () hanya menguji jika Anda benar-benar memiliki objek NaN.
sumber
Saya tidak begitu yakin ketika datang ke JS tapi saya telah melihat hal-hal serupa dalam bahasa lain dan biasanya karena fungsinya hanya memeriksa apakah null sama persis dengan NaN (yaitu null === NaN akan salah). Dengan kata lain itu bukan berarti ia berpikir bahwa nol sebenarnya adalah sebuah angka, tetapi itu lebih dari nol itu bukan NaN. Ini mungkin karena keduanya direpresentasikan secara berbeda di JS sehingga mereka tidak akan sama persis, dengan cara yang sama dengan 9! == '9'.
sumber
Dalam ES5, itu didefinisikan sebagai
isNaN (number)
mengembalikan true jika argumen memaksa ke NaN, dan sebaliknya mengembalikan false.Dan lihat tabel konversi ToNumber operasi abstrak . Jadi secara internal mengevaluasi mesin js
ToNumber(Null)
adalah+0
, maka akhirnyaisNaN(null)
adalahfalse
sumber
catatan:
Operator == melakukan konversi tipe, sedangkan === tidak.
Situs web Douglas Crockford , sebuah Yahoo! Penginjil JavaScript, adalah sumber yang bagus untuk hal-hal seperti ini.
sumber