Baru-baru ini saya menjalankan beberapa kode saya melalui JSLint ketika saya menemukan kesalahan ini. Hal yang menurut saya lucu tentang kesalahan ini adalah bahwa kesalahan ini secara otomatis mengasumsikan bahwa semua == harus ===.
Apakah itu masuk akal? Saya dapat melihat banyak contoh yang tidak ingin Anda bandingkan jenisnya, dan saya khawatir ini benar-benar dapat menyebabkan masalah.
Kata "Diharapkan" akan menyiratkan bahwa ini harus dilakukan SETIAP waktu ..... Itulah yang tidak masuk akal bagi saya.
javascript
jslint
Metropolis
sumber
sumber
myVar == null
pemeriksaan, ya, perubahan besar. ; ^) Argumen Crockford adalah bahwa itu membuat makna kode lebih tepat, dan itu sulit untuk diperdebatkan.Jawaban:
IMO, menggunakan secara membabi buta
===
, tanpa mencoba memahami cara kerja konversi jenis tidak masuk akal.Ketakutan utama tentang operator Equals
==
adalah bahwa aturan perbandingan yang bergantung pada jenis yang dibandingkan dapat membuat operator menjadi non-transitif, misalnya, jika:Tidak benar-benar menjamin bahwa:
Sebagai contoh:
'0' == 0; // true 0 == ''; // true '0' == ''; // false
Operator Strict Equals
===
tidak terlalu diperlukan saat Anda membandingkan nilai dengan tipe yang sama, contoh paling umum:if (typeof foo == "function") { //.. }
Kami membandingkan hasil
typeof
operator, yang selalu berupa string , dengan string literal ...Atau ketika Anda mengetahui aturan pemaksaan tipe, misalnya, periksa apakah ada sesuatu
null
atauundefined
sesuatu:if (foo == null) { // foo is null or undefined } // Vs. the following non-sense version: if (foo === null || typeof foo === "undefined") { // foo is null or undefined }
sumber
===
operator adalah kejelasan kode. Tidak ada situasi yang masuk akal untuk digunakan==
karena tidak akan pernah sejelas dan dapat dipahami sebagai operator identitas. Ini bukan tentang apakah Anda memahami operator atau tidak, ini tentang penggunaan yang membuat kode Anda lebih mudah dibaca dengan hampir tanpa biaya. Satu-satunya pengembang yang menentang operator identitas adalah pengembang tunggal dan orang-orang yang tidak bekerja dalam tim. Menurut definisi, orang yang kodenya tidak ditinjau oleh cukup banyak mata.there is no reasonable situation
adalah salah saji yang parah. Pikirkan tentang jenis Javascript (asli)Number
danString
. Keberadaan mereka membuktikan bahwa penulis Javascript memiliki kasus penggunaan tertentu dalam pikirannya==
. Apakah menurut Andanew String('hi') === 'hi'
penilaian kefalse
sangat jelas? Harap tulis potongan kode yang menguji argumen fungsi Anda agar tidak'hi'
menerima String dan string dan beri tahu saya bahwa itu sudah jelas.JSLint secara inheren lebih defensif daripada yang dimungkinkan oleh sintaks Javascript.
Dari dokumentasi JSLint:
sumber
==
operator. The===
adalah kasus khusus ... JSLint mencoba untuk membuatnya tampak seperti menggunakan==
entah bagaimana salah ... Namun, cobalah ini:var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}
. Tipe primitif memiliki kelas terkait yang menggantikannya (Number
,String
) dan Javascript bergantung pada==
operator untuk membuat perbandingan ini natural.Ingatlah bahwa JSLint menerapkan gagasan satu orang tentang apa yang seharusnya menjadi JavaScript yang baik. Anda masih harus menggunakan akal sehat saat menerapkan perubahan yang disarankannya.
Secara umum, membandingkan jenis dan nilai akan membuat kode Anda lebih aman (Anda tidak akan mengalami perilaku yang tidak terduga saat konversi jenis tidak melakukan apa yang menurut Anda seharusnya).
sumber
Triple-equal berbeda dengan double-equal karena selain memeriksa apakah kedua sisi memiliki nilai yang sama, triple-equal juga memeriksa apakah keduanya memiliki tipe data yang sama.
Begitu
("4" == 4)
juga benar, sedangkan("4" === 4)
salah.Triple-equal juga berjalan sedikit lebih cepat, karena JavaScript tidak perlu membuang waktu melakukan konversi jenis apa pun sebelum memberi Anda jawabannya.
JSLint sengaja ditujukan untuk membuat kode JavaScript Anda seketat mungkin, dengan tujuan mengurangi bug yang tidak jelas. Ini menyoroti hal semacam ini untuk mencoba membuat Anda membuat kode dengan cara yang memaksa Anda untuk menghormati tipe data.
Tetapi hal yang baik tentang JSLint adalah bahwa itu hanya sebuah panduan. Seperti yang mereka katakan di situs, itu akan menyakiti perasaan Anda, bahkan jika Anda adalah programmer JavaScript yang sangat baik. Tetapi Anda tidak perlu merasa wajib untuk mengikuti nasihatnya. Jika Anda telah membaca apa yang dikatakan dan Anda memahaminya, tetapi Anda yakin kode Anda tidak akan rusak, maka tidak ada paksaan pada Anda untuk mengubah apa pun.
Anda bahkan dapat memberi tahu JSLint untuk mengabaikan kategori pemeriksaan jika Anda tidak ingin dibombardir dengan peringatan bahwa Anda tidak akan melakukan apa-apa.
sumber
Kutipan dari http://javascript.crockford.com/code.html :
JSLint sangat ketat, 'webjslint.js' mereka bahkan tidak lolos validasinya sendiri.
sumber
webjslint.js
tidak memvalidasi - meskipun sebagian besar kesalahan yang saya lihat sekarang berkaitan dengan jarak. Jelas, seseorang harus menggunakan akal sehat dan penilaian yang masuk akal saat meninjau JavaScript menggunakan JSLint.always
secara otomatis mendiskualifikasi kutipan ini sebagai kebijaksanaan. Pemrogram cerdas tidak dogmatis. Mereka menggunakan yang terbaik dalam situasi tertentu. Dan mereka menyambut serta merangkul alat apa pun yang dibangun di dalam inti bahasa, tidak hanya mengabaikannya dengan ajust never touch it
. Intinya: Kode saya lebih pendek (dan tidak hanya dari menyimpan satu=
karakter), sehingga situs saya memuat lebih cepat, dengan biaya bandwidth yang lebih sedikit, sehingga pengguna saya dilayani dengan lebih baik.Jika Anda ingin menguji kepalsuan. JSLint tidak mengizinkan
if (foo == null)
tapi memungkinkan
if (!foo)
sumber
===
, yang direkomendasikan JSLint.foo == null
memeriksa null atau undefined.!foo
memeriksa null, undefined, 0 dan string kosong.Untuk membantu menjelaskan pertanyaan ini dan juga menjelaskan mengapa NetBeans (dari) 7.3 mulai menampilkan peringatan ini, ini adalah ekstrak dari tanggapan pelacak bug NetBeans ketika seseorang melaporkan ini sebagai bug:
Ini adalah praktik yang baik untuk menggunakan === daripada == di JavaScript.
Referensi
sumber
Yah, itu tidak bisa menyebabkan masalah, itu hanya memberi Anda nasihat. Ambil atau tinggalkan. Meski begitu, saya tidak yakin seberapa pintar itu. Mungkin ada konteks yang tidak menampilkannya sebagai masalah.
sumber