Pertama-tama saya ingin menyebutkan bahwa saya tahu caranya isNaN()
dan Number.isNaN()
bekerja. Saya membaca The Definite Guide oleh David Flanagan dan dia memberikan contoh bagaimana memeriksa apakah nilainya NaN
:
x !== x
Hal ini akan mengakibatkan true
jika dan hanya jika x
isNaN
.
Tapi sekarang saya punya pertanyaan: mengapa dia menggunakan perbandingan yang ketat? Karena sepertinya begitu
x != x
berperilaku dengan cara yang sama. Apakah aman menggunakan kedua versi, atau saya kehilangan beberapa nilai dalam JavaScript yang akan kembali true
untuk x !== x
dan false
untuk x != x
?
javascript
nan
Giorgi Nakeuri
sumber
sumber
!==
cek daripada!=
cek. Sejauh yang saya ketahui tidak ada nilai lain di manax != x
. Tetapi ada dua kelompok pengembang JavaScript yang berbeda: mereka yang lebih suka!=
dan yang lebih suka!==
, baik untuk kecepatan, kejelasan, ekspresi, dll.NaN
bukan tipe yang unik, ini nomor. Ini adalah nilai unik yang tidak sama dengan dirinya sendiri.===
dengan NaN untuk menegaskan bahwa NaN tidak sama dengan dirinya sendiri. Dia tidak "salah," dia melakukannya sebagai latihan mengajar, menunjukkan bahwa itu tidak berhasil.Jawaban:
Pertama, izinkan saya menunjukkan bahwa itu
NaN
adalah nilai yang sangat istimewa: Menurut definisi, itu tidak sama dengan dirinya sendiri. Itu berasal dari standar IEEE-754 yang digunakan angka JavaScript. Nilai "bukan angka" tidak pernah sama dengan nilai itu sendiri, bahkan ketika bitnya sama persis. (Yang tidak harus dalam IEEE-754, ini memungkinkan untuk beberapa nilai "bukan angka" yang berbeda.) Itulah mengapa ini bahkan muncul; semua nilai lain dalam JavaScript sama dengan dirinya sendiri,NaN
hanya istimewa.Tidak, bukan kau. Satu-satunya perbedaan antara
!==
dan!=
adalah bahwa yang terakhir akan melakukan tipe paksaan jika perlu untuk mendapatkan jenis operan yang sama. Padax != x
, jenis operan adalah sama, dan itu persis sama denganx !== x
.Ini jelas dari awal definisi Operasi Kesetaraan Abstrak :
Dua langkah pertama adalah pipa ledeng dasar. Jadi sebenarnya, langkah pertama
==
adalah untuk melihat apakah tipenya sama dan, jika demikian, lakukan===
saja.!=
dan!==
hanya versi negated dari itu.Jadi jika Flanagan benar bahwa hanya
NaN
akan memberikan yang benar untukx !== x
, kita dapat yakin bahwa itu juga benar bahwa hanyaNaN
akan memberikan yang benar untukx != x
.Banyak programmer JavaScript yang secara default menggunakan
===
dan!==
menghindari beberapa jebakan di sekitar tipe paksaan yang dilakukan operator longgar, tetapi tidak ada yang bisa dibaca dalam penggunaan Flanagan terhadap operator ketat dan longgar dalam hal ini.sumber
4.9.1 - Equality and Inequality Operators
bagian membaca ulang dan ini tampaknya menjadi jawabannya. Poin kunci untuk===
perbandingan adalah:If the two values have the same type, test them for strict equality as described above. If they are strictly equal, they are equal. If they are not strictly equal, they are not equal
.a
sebenarnya merupakan fungsi dan tidak mengembalikan nilai yang sama dua kali? Itu bukan hal yang sama dengan nilai yang!==
akan benar, itulah yang ditanyakan OP. Itu hanya fungsi yang mengembalikan nilai yang berbeda.foo() !== foo()
tidak harus benar juga, karenafoo
mungkin mengembalikan nilai yang berbeda pada setiap panggilan.Untuk keperluan NaN,
!=
dan!==
lakukan hal yang sama.Namun, banyak programmer menghindari
==
atau!=
menggunakan JavaScript. Misalnya, Douglas Crockford menganggap mereka sebagai " bagian buruk " dari bahasa JavaScript karena mereka berperilaku dengan cara yang tidak terduga dan membingungkan:sumber
Hanya untuk bersenang-senang, izinkan saya menunjukkan kepada Anda contoh buatan di mana
x
tidak adaNaN
tetapi operator berperilaku berbeda pula. Definisi pertama:Lalu kita punya
tapi
sumber
foo() != foo()
mana foo mengembalikan 1 lalu 2. Misalnya, nilainya tidak sama, hanya membandingkan nilai yang berbeda.Saya hanya ingin menunjukkan
NaN
bukan satu-satunya hal yang menghasilkanx !== x
tanpa menggunakan objek global. Ada banyak cara pintar untuk memicu perilaku ini. Berikut ini salah satu yang menggunakan getter:Sebagai jawaban lain menunjukkan,
==
melakukan jenis koersi, tetapi dalam bahasa lain dan par standar - NaN menunjukkan kegagalan perhitungan, dan untuk alasan yang baik tidak sama dengan itu sendiri.Untuk beberapa alasan di luar saya orang menganggap ini masalah dengan JS tetapi kebanyakan bahasa yang memiliki dua kali lipat (yaitu, C, Java, C ++, C #, Python dan lain-lain) menunjukkan perilaku yang tepat ini dan orang-orang baik-baik saja dengan itu.
sumber
Seperti terkadang, gambar lebih baik daripada kata-kata, periksa tabel ini (yang merupakan alasan bagi saya untuk membuat ini sebagai jawaban, bukan komentar karena mendapat visibilitas yang lebih baik).
Di sana Anda dapat melihat bahwa perbandingan kesetaraan yang ketat (===) hanya mengembalikan true jika jenis dan konten cocok, maka
Sementara perbandingan kesetaraan abstrak (==) hanya memeriksa konten * dengan mengonversi jenis dan kemudian membandingkannya dengan ketat:
Meskipun tidak jelas, tanpa berkonsultasi dengan ECMA , apa yang dipertimbangkan JavaScript saat membandingkan, dengan cara yang dievaluasi oleh kode di bawah sebagai true.
sumber