Dalam JavaScript, mengapa isNaN(" ")
mengevaluasi false
, tetapi isNaN(" x")
mengevaluasi true
?
Saya melakukan operasi numerik pada kolom input teks, dan saya memeriksa apakah lapangan adalah null
, ""
, atau NaN
. Ketika seseorang mengetikkan beberapa spasi di bidang, validasi saya gagal pada ketiganya, dan saya bingung mengapa itu bisa melewati isNaN
pemeriksaan.
javascript
nan
Pembalas IVR
sumber
sumber
"" == false // true
danisNaN(" ") // false
Jawaban:
JavaScript mengartikan string kosong sebagai 0, yang kemudian gagal dalam tes isNAN. Anda dapat menggunakan parseInt pada string terlebih dahulu yang tidak akan mengkonversi string kosong ke 0. Hasilnya kemudian gagal adalahNAN.
sumber
isNaN(arg)
. 1) Konversi nomor arg ke, 2) Periksa apakah nomor itu adalah nilai numerikNaN
. Itu membantu saya memahaminya dengan lebih baik.Anda mungkin menemukan ini mengejutkan atau mungkin tidak, tetapi di sini ada beberapa kode uji untuk menunjukkan kepada Anda keanehan dari mesin JavaScript.
jadi ini artinya
dan
tapi
Selamat bersenang-senang :)
sumber
null
,""
, dan" "
saya sendiri. Terima kasih!Untuk memahaminya dengan lebih baik, silakan buka Ecma-Script spec pdf di halaman 43 "ToNumber Diterapkan ke Tipe String"
jika sebuah string memiliki sintaks numerik, yang dapat berisi sejumlah karakter spasi-putih, string dapat dikonversi ke tipe angka. Empty string dievaluasi menjadi 0. Juga string yang 'Infinity' harus berikan
sumber
Coba gunakan:
Atau
sumber
Dari
MDN
alasan masalah yang Anda hadapiAnda mungkin ingin memeriksa jawaban komprehensif berikut yang mencakup perbandingan NaN untuk kesetaraan juga.
sumber
Saya pikir itu karena pengetikan Javascript:
' '
dikonversi menjadi nol, sedangkan'x'
bukan:sumber
Jika Anda ingin menerapkan fungsi isNumber yang akurat, berikut adalah salah satu cara untuk melakukannya dari Javascript: The Good Parts oleh Douglas Crockford [halaman 105]
sumber
Jawaban Tidak Sepenuhnya Benar
Jawaban Antonio Haley yang sangat tervotasikan dan diterima di sini membuat asumsi yang salah bahwa proses ini berjalan melalui
parseInt
fungsi JavaScript :Kami dapat dengan mudah menyangkal pernyataan ini dengan string
"123abc"
:Dengan ini, kita dapat melihat bahwa
parseInt
fungsi JavaScript kembali"123abc"
sebagai angka123
, namunisNaN
fungsinya memberi tahu kita bahwa"123abc"
itu bukan angka.Jawaban yang benar
ECMAScript-262 mendefinisikan cara kerja
isNaN
cek di bagian 18.2.3 .The
ToNumber
referensi fungsi itu juga didefinisikan dalam ECMAScript-262 ini bagian 7.1.3 . Di sini, kita diberitahu bagaimana JavaScript menangani Strings yang diteruskan ke fungsi ini.Contoh pertama yang diberikan dalam pertanyaan adalah string yang hanya berisi karakter spasi putih. Bagian ini menyatakan bahwa:
The
" "
contoh String Oleh karena itu dikonversi menjadi+0
, yang merupakan nomor.Bagian yang sama juga menyatakan:
Tanpa mengutip semua cek yang terkandung dalam bagian itu,
" x"
contoh yang diberikan dalam pertanyaan jatuh ke dalam kondisi di atas karena tidak dapat diartikan sebagai aStringNumericLiteral
." x"
Oleh karena itu dikonversi keNaN
.sumber
Saya tidak yakin mengapa , tetapi untuk mengatasi masalah ini Anda selalu bisa memotong spasi sebelum memeriksa. Anda mungkin ingin tetap melakukannya.
sumber
Fungsi
isNaN("")
melakukan pemaksaan tipe String to NumberECMAScript 3-5 menetapkan nilai pengembalian berikut untuk typeof operator:
Lebih baik untuk membungkus tes kami di badan fungsi:
Fungsi ini tidak dimaksudkan untuk menguji tipe variabel , melainkan menguji nilai yang dipaksakan . Sebagai contoh, booleans dan string dipaksa ke angka, jadi mungkin Anda ingin memanggil fungsi ini sebagai
isNumberCoerced()
jika tidak perlu menguji jenis selain string dan angka , maka cuplikan berikut ini dapat digunakan sebagai bagian dari beberapa kondisi:
sumber
Saya menyarankan Anda untuk menggunakan fungsi berikut jika Anda benar-benar ingin memeriksa apakah itu bilangan bulat:
sumber
Yang
isNaN(" ")
salah adalah bagian dari perilaku membingungkan dariisNaN
fungsi global karena paksaan non-angka ke tipe numerik.Dari MDN :
Perhatikan juga bahwa dengan ECMAScript 6, sekarang juga ada
Number.isNaN
metode, yang menurut MDN:Sayangnya :
Bahkan metode ECMAScript 6
Number.isNaN
memiliki masalah sendiri, seperti diuraikan dalam posting blog - Memperbaiki masalah JavaScript dan ES6 NaN yang jelek .sumber
The
isNaN
Fungsi mengharapkan Nomor sebagai argumen, sehingga argumen dari jenis lain (dalam kasus Anda string) akan dikonversi ke Nomor sebelum logika fungsi yang sebenarnya dilakukan. (Ketahuilah bahwaNaN
ini juga merupakan nilai dari tipe Number!)Btw. ini umum untuk semua fungsi bawaan - jika mereka mengharapkan argumen tipe tertentu, argumen aktual akan dikonversi menggunakan fungsi konversi standar. Ada konversi standar antara semua tipe dasar (bool, string, number, object, date, null, undefined.)
Konversi standar untuk
String
keNumber
dapat dipanggil secara eksplisit denganNumber()
. Jadi kita dapat melihat bahwa:Number(" ")
mengevaluasi ke0
Number(" x")
mengevaluasi keNaN
Mengingat ini, hasil dari
isNaN
fungsi ini sepenuhnya logis!Pertanyaan sebenarnya adalah mengapa konversi String-to-Number standar berfungsi seperti itu. Konversi string-ke-angka benar-benar dimaksudkan untuk mengkonversi string numerik seperti "123" atau "17.5e4" ke angka yang setara. Konversi pertama melompati spasi putih awal (jadi "123" valid) dan kemudian mencoba untuk menguraikan sisanya sebagai angka. Jika itu tidak dapat diuraikan sebagai angka ("x" tidak) maka hasilnya adalah NaN. Tetapi ada aturan khusus yang eksplisit bahwa string yang kosong atau hanya spasi kosong dikonversi ke 0. Jadi ini menjelaskan konversi.
Referensi: http://www.ecma-international.org/ecma-262/5.1/#sec-9.3.1
sumber
Saya menulis fungsi kecil cepat ini untuk membantu menyelesaikan masalah ini.
Ini hanya memeriksa setiap karakter yang bukan numerik (0-9), yang bukan '-' atau '.', Dan yang tidak terdefinisi, nol atau kosong dan mengembalikan true jika tidak ada kecocokan. :)
sumber
Seperti yang dijelaskan lainnya,
isNaN
fungsi akan memaksa string kosong menjadi angka sebelum memvalidasinya, sehingga mengubah string kosong menjadi 0 (yang merupakan angka yang valid). Namun, saya menemukan bahwaparseInt
fungsi akan kembaliNaN
ketika mencoba mengurai string kosong atau string dengan spasi saja. Dengan demikian kombinasi berikut tampaknya berfungsi dengan baik:if ( isNaN(string) || isNaN(parseInt(string)) ) console.log('Not a number!');
Pemeriksaan ini akan berfungsi untuk angka positif, angka negatif dan angka dengan titik desimal, jadi saya percaya ini mencakup semua kasus angka umum.
sumber
NaN
! == "bukan angka"NaN
adalah nilai dari Tipe Angkaini adalah definisi isNaN () dalam ECMAScript
Cobalah untuk mengubah nilai apa pun menjadi Angka.
Jika Anda ingin menentukan apakah nilainya
NaN
, Anda harus mencoba mengubahnya menjadi nilai angka terlebih dahulu.sumber
Fungsi ini sepertinya berfungsi dalam pengujian saya
sumber
return !(s === "" || s === null || parseInt(s) == 'NaN');
Bagaimana dengan
sumber
The JavaScript built-in Isnan fungsi, adalah - seperti yang harus diharapkan secara default - sebuah "Dynamic Type Operator". Oleh karena itu semua nilai yang (selama proses DTC) dapat menghasilkan true | salah seperti
"", " ", " 000"
, tidak bisa NaN.Berarti argumen yang diberikan akan terlebih dahulu menjalani konversi seperti pada:
Penjelasan:
Di baris atas badan fungsi, kami (pertama) berusaha untuk berhasil mengubah argumen menjadi objek angka. Dan (kedua), menggunakan operator titik kita - untuk kenyamanan kita sendiri - segera menanggalkan, yang primitif nilai dari objek yang dibuat.
Pada baris kedua, kita mengambil nilai yang diperoleh pada langkah sebelumnya, dan keuntungan dari kenyataan bahwa NaN tidak sama dengan apa pun di alam semesta, bahkan dengan dirinya sendiri, misalnya:
NaN == NaN >> false
untuk akhirnya membandingkannya (untuk ketidaksetaraan) dengan dirinya sendiri .Dengan cara ini fungsi kembali akan menghasilkan true hanya ketika, dan hanya jika, pengembalian argumen yang disediakan, adalah upaya gagal konversi ke objek nomor, yaitu, nomor bukan-angka; misalnya, NaN.
isNaNstatic ()
Namun, untuk Operator Tipe Statis - jika diperlukan dan saat dibutuhkan - kita dapat menulis fungsi yang jauh lebih sederhana seperti:
Dan hindari DTC sama sekali sehingga jika argumen tidak secara eksplisit nomor NaN, itu akan mengembalikan false. Karenanya, pengujian terhadap hal-hal berikut:
isNaNStatic(" x"); // will return false
karena masih string.Namun:
isNaNStatic(1/"x"); // will of course return true.
seperti akan misalnyaisNaNStatic(NaN); >> true
.Tetapi bertentangan dengan
isNaN
,isNaNStatic("NaN"); >> false
karena itu (argumen) adalah string biasa.ps: Versi isNaN statis bisa sangat berguna dalam skenario pengkodean modern. Dan itu mungkin salah satu alasan utama saya meluangkan waktu untuk memposting ini.
Salam.
sumber
isNAN(<argument>)
adalah fungsi untuk mengetahui apakah argumen yang diberikan adalah angka ilegal.isNaN
typecasts argumen menjadi tipe Number. Jika Anda ingin memeriksa apakah argumennya Numeric atau tidak? Silakan gunakan$.isNumeric()
fungsi di jQuery.Yaitu, isNaN (foo) setara dengan isNaN (Number (foo)). Ia menerima string apa pun yang memiliki semua angka sebagai angka karena alasan yang jelas. Misalnya
sumber
Saya menggunakan ini
sumber
Ketika memeriksa apakah nilai string tertentu dengan spasi atau
" "
yangisNaN
mungkin mencoba untuk melakukan validasi string misalnya:// value = "123 " if (value.match(/\s/) || isNaN(value)) { // do something }
sumber