Saya pindah satu tahun yang lalu dari bahasa OO klasik seperti Java ke JavaScript. Kode berikut jelas tidak direkomendasikan (atau bahkan tidak benar) di Java:
if(dayNumber = getClickedDayNumber(dayInfo))
{
alert("day number found : " + dayNumber);
}
function getClickedDayNumber(dayInfo)
{
dayNumber = dayInfo.indexOf("fc-day");
if(dayNumber != -1) //substring found
{
//normally any calendar month consists of "40" days, so this will definitely pick up its day number.
return parseInt(dayInfo.substring(dayNumber+6, dayNumber+8));
}
else return false;
}
Pada dasarnya saya baru tahu bahwa saya dapat menetapkan variabel ke nilai dalam pernyataan kondisi if, dan segera memeriksa nilai yang ditetapkan seolah-olah itu adalah boolean.
Untuk taruhan yang lebih aman, saya biasanya memisahkannya menjadi dua baris kode, tetapkan terlebih dahulu lalu periksa variabelnya, tetapi sekarang saya menemukan ini, saya hanya ingin tahu apakah ini praktik yang baik atau tidak di mata pengembang JavaScript berpengalaman?
javascript
Michael Mao
sumber
sumber
"The following code is definitely not recommended (or event not correct) in Java..."
Apakah itu benar dalam JavaScript? Karena, sejauh yang saya lihat, Anda mengembalikan integer (return parseInt(...)
) jikadayNumber != -1
benar, tetapi boolean jika salah.Jawaban:
Saya tidak akan merekomendasikannya. Masalahnya adalah, ini terlihat seperti kesalahan umum saat Anda mencoba membandingkan nilai, tetapi menggunakan nilai tunggal,
=
bukan==
atau===
. Misalnya, saat Anda melihat ini:Anda tidak tahu apakah itu yang ingin mereka lakukan, atau apakah mereka bermaksud menulis ini:
Jika Anda benar-benar ingin melakukan tugas tersebut, saya akan merekomendasikan untuk melakukan perbandingan eksplisit juga:
sumber
if (resultArr = myNeedle.exec(myHaystack)) {...}
worksif ((resultArr = myNeedle.exec(myHaystack)) === true) {...}
bukan karena penugasan ke resultArr selalu benar meski hasil fungsinya bukan. Jika ada yang menggunakan ini .. konstruksi, ingatlah untuk mendeklarasikan variabel hasil terlebih dahulu; 'var' tidak sah dalam pernyataan kondisi if.if (!!(value = someFunction()))
, tetapi seperti yang Anda katakan, masalahnya adalah Anda tidak dapat menggunakanvar
insideif
sehingga Anda akhirnya menciptakan global, atau tidak mencapai apa-apa karena Anda tetap harus mendeklarasikannyavalue
di baris terpisah. Malu, saya sangat menyukai konstruksi ini di C ++.true
hanya ketika fungsi kembalitrue
, tetapi dalam semua kasus lain (termasuk ketika array, string, angka, atau nol dikembalikan) yang dievaluasifalse
.Saya tidak melihat bukti bahwa ini bukan praktik yang baik. Ya, ini mungkin terlihat seperti kesalahan tetapi itu mudah diatasi dengan komentar yang bijaksana. Ambil contoh:
Mengapa fungsi itu diizinkan untuk berjalan untuk kedua kalinya dengan:
Karena versi pertama TERLIHAT buruk? Saya tidak setuju dengan logika itu.
sumber
x = processorItensiveFunction(); if(x) { alert(x); }
if ( ! x = anyFunction() )
tidak dapat dibaca? Tidak perlu ada komentar apa pun.if-else
situasi. Pertimbangkan- Prioritasif (condition) {...} else if (x = processorIntensiveFunction()) {alert(x)}
Andax = processorIntensiveFunction();
akan menjadi usaha yang sia-sia jika awalnyacondition
benar.Saya melakukannya berkali-kali. Untuk melewati peringatan JavaScript, saya menambahkan dua tanda kurung:
Anda harus menghindarinya, jika Anda benar-benar ingin menggunakannya, tulis komentar di atasnya dengan mengatakan apa yang Anda lakukan.
sumber
if ((a = [1, 2]).length > 0) { console.log(a); }
manaa
belum diinisialisasi di mana pun dan itu memang berhasil (bagus! Membuat penggunaan regex jauh lebih mudah). Apakah ini benar bahwa saya tidak membutuhkannya divar|const|let
sini? Apakah Anda kebetulan tahu di mana saya bisa membaca lebih banyak tentang trik ini ?Anda juga dapat melakukan ini di Java. Dan tidak, ini bukan praktik yang baik. :)
(Dan gunakan
===
dalam Javascript untuk kesetaraan yang diketik. Baca buku Crockford's The Good Parts di JS.)sumber
if (foo = getSomeBoolValue()) { }
Ada satu kasus saat Anda melakukannya, dengan
while
-loops.Saat membaca file, biasanya Anda melakukan seperti ini:
Lihat
while
-loop pada baris 9. Di sana, baris baru dibaca dan disimpan dalam variabel, dan kemudian isi loop dijalankan. Saya tahu ini bukanif
-statement, tapi saya rasa beberapa saat loop dapat dimasukkan dalam pertanyaan Anda juga.Alasan untuk ini adalah bahwa ketika menggunakan
FileInputStream
, setiap kali Anda memanggilFileInputStream.readLine()
, itu membaca baris berikutnya dalam file, jadi jika Anda akan memanggilnya dari perulangan dengan hanyafileIn.readLine() != null
tanpa menetapkan variabel, daripada memanggil(currentLine = fileIn.readLine()) != null
, dan kemudian memanggilnya dari di dalam loop juga, Anda hanya akan mendapatkan setiap baris kedua.Semoga Anda mengerti, dan semoga berhasil!
sumber
Anda juga dapat melakukan tugas dalam pernyataan if di Java. Contoh yang bagus adalah membaca sesuatu dan menuliskannya:
http://www.exampledepot.com/egs/java.io/CopyFile.html?l=new
Kode:
sumber
Jika Anda merujuk ke buku Martin Fowlers Refactoring memperbaiki desain kode yang ada ! Lalu ada beberapa kasus di mana itu akan menjadi praktik yang baik misalnya. persyaratan kompleks yang panjang untuk menggunakan panggilan fungsi atau metode untuk menegaskan kasus Anda:
Dan ya jawabannya juga berlaku untuk implementasi Java. Itu tidak menetapkan fungsi kondisional ke variabel meskipun dalam contoh.
sumber
Ini bukan praktik yang baik. Anda akan segera bingung tentang itu. Ini terlihat serupa dengan kesalahan umum: operator misuse "=" dan "==".
Anda harus memecahnya menjadi 2 baris kode. Ini tidak hanya membantu membuat kode lebih jelas, tetapi juga mudah untuk difaktor ulang di masa mendatang. Bayangkan Anda mengubah kondisi IF? Anda mungkin tidak sengaja menghapus garis dan variabel Anda tidak lagi mendapatkan nilai yang ditetapkan padanya.
sumber
Saya akan menganggap ini lebih dari gaya C sekolah tua; ini bukan praktik yang baik dalam JavaScript jadi Anda harus menghindarinya.
sumber
Anda bisa melakukan sesuatu seperti ini:
sumber
Saya datang ke sini dari golang, di mana melihat sesuatu seperti itu biasa
Di mana
err
hanya dicakup keif
blok itu. Karena itu, inilah yang saya lakukan di es6, yang tampaknya cukup jelek, tetapi tidak membuat aturan eslint saya yang agak ketat berubah, dan mencapai hal yang sama.Tanda kurung kurawal menentukan, eh, "lingkup leksikal" baru? Artinya saya bisa menggunakan
const
, danerr
tidak tersedia untuk blok luar.sumber