Saya memiliki kode ini (diambil dari pertanyaan ini ):
var walk = function(dir, done) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err)
return done(err);
var pending = list.length;
if (!pending)
return done(null, results);
list.forEach(function(file) {
file = path.resolve(dir, file);
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
results = results.concat(res);
if (!--pending)
done(null, results);
});
} else {
results.push(file);
if (!--pending)
done(null, results);
}
});
});
});
};
Saya mencoba untuk mengikutinya, dan saya pikir saya mengerti segalanya kecuali mendekati akhir di mana dikatakan !--pending
. Dalam konteks ini, apa yang dilakukan perintah itu?
Sunting: Saya menghargai semua komentar lebih lanjut, tetapi pertanyaannya telah dijawab berkali-kali. Bagaimanapun, terima kasih!
javascript
decrement
prefix-operator
not-operator
Kieran E
sumber
sumber
!~--[value] ^ true
Saya menyebut kode seperti ini "keamanan pekerjaan"-->
operatornya?Jawaban:
!
membalikkan suatu nilai, dan memberi Anda boolean yang berlawanan:--[value]
kurangi satu (1) dari angka, dan lalu kembalikan angka itu untuk dikerjakan:Jadi,
!--pending
kurangi satu dari yang tertunda, dan kemudian kembalikan kebalikan dari nilai kebenaran / kepalsuannya (baik itu benar atau tidak0
).Dan ya, ikuti ProTip. Ini mungkin idiom umum dalam bahasa pemrograman lain, tetapi untuk sebagian besar pemrograman JavaScript deklaratif ini terlihat sangat asing.
sumber
--
hanya bertindak pada variabel; Anda tidak dapat menerapkannya pada nilai secara umum.validSimpleAssignmentTarget
s, tepatnya. Itu termasuk referensi pengidentifikasi dan referensi properti.--0
dan--1
tidak akan bekerja. Literal numerik tidak berlaku untuk ekspresi sisi kirii > -1
hal itu daripadai--
(dan btw Anda lupai = init() - 1
). Itulah idiom untuk ... dan setiap programmer harus mempelajarinya.Itu bukan operator khusus, ini 2 operator standar satu demi satu:
--
)!
)Ini menyebabkan
pending
akan dikurangi dan kemudian diuji untuk melihat apakah itu nol.sumber
if(pending === 1)
?if( pending === 1 ) { done... } else { pending = pending - 1; }
.Sejumlah jawaban menjelaskan apa yang dilakukan perintah ini, tetapi tidak mengapa dilakukan seperti itu di sini.
Saya berasal dari dunia C, dan saya membaca
!--pending
"hitung mundurpending
dan periksa apakah itu nol" tanpa benar-benar memikirkannya. Ini adalah ungkapan yang menurut saya harus diketahui oleh programmer dalam bahasa yang sama.Fungsi ini digunakan
readdir
untuk mendapatkan daftar file dan subdirektori, yang secara kolektif saya sebut "entri".Variabel
pending
melacak berapa banyak dari ini yang masih diproses. Dimulai sebagai panjang daftar, dan dihitung ke bawah menuju nol karena setiap entri diproses.Entri-entri ini dapat diproses tidak sesuai pesanan, oleh karena itu perlu untuk menghitung mundur daripada hanya menggunakan loop sederhana. Ketika semua entri telah diproses, panggilan balik
done
dipanggil untuk memberi tahu penelepon asli tentang fakta ini.Dalam panggilan pertama ke
done
diawali denganreturn
, bukan karena kami ingin mengembalikan nilai, tetapi hanya untuk membuat fungsi berhenti dieksekusi pada saat itu. Itu akan menjadi kode yang lebih bersih untuk menjatuhkanreturn
dan meletakkan alternatif dalam sebuahelse
.sumber
!--pending
akan gagal banyak linters dan pedoman gaya. Itu cukup bagi saya untuk mengatakan itu mungkin tidak idiomatis (terlepas dari apakah alternatifnya "lebih baik").int
kebool
implisit, dan sama sekali tidak ada hubungannya dengan penggunaan!--
.Itu sebuah steno.
!
tidak".--
mengurangi nilai.Jadi,
!--
periksa apakah nilai yang diperoleh dari meniadakan hasil penurunan nilai salah.Coba ini:
Yang pertama adalah false, karena nilai x adalah 1, yang kedua adalah benar, karena nilai x adalah 0.
Catatan samping:
!x--
akan memeriksa apakah x salah pertama, dan kemudian menurunkannya.sumber
!
, sedangkan pre-fix memiliki prioritas lebih rendah. Diutamakan Operator JavaScriptvar x = 2; console.log(!x--); console.log(!x--); console.log(!x--);
). Sementara Post-fix--
mungkin dijalankan pertama kali, nilai kembalinya adalah nilai variabel sebelum decrementing ( Decrement Opperator ).!--
mengembalikan negasi hasil penurunan nilai." Hanya kode luar, seperticonsole.log()
, yang memeriksa apakah isinya benar.!
adalah operator JavaScript NOT--
adalah operator pra-pengurangan. Begitu,sumber
--
operator bisa bekerja dengan konstan ... mungkin maksud Anda,--x
bukan--0
?cara
cara
sumber
if(0 == pending)
karena potensi kesalahan ketik.if(0 = pending)
adalah kesalahan sintaksis.if(pending = 0)
adalah tugas yang akan menyebabkan perilaku membingungkan dalam kode selesai.if(0 = pending)
bukan kesalahan sintaksis - ia mem-parsing dengan baik - tetapi Kesalahan Referensi karena0
tidak dapat ditentukan (ref ECMA-262 (edisi ke-6) detik 12.14.1).Ini bukan operator yang diikuti oleh pre-decrementer di tempat.
Jadi jika
pending
integer dengan nilai 1:sumber
Ia hanya berkurang
pending
satu dan memperoleh komplemen logisnya (negasi). Komplemen logis dari angka yang berbeda dari 0 adalahfalse
, untuk 0 adalahtrue
.sumber
Penjelasan
Ini adalah 2 operator, a
!
dan a--
Jadi,
--
pengurangan x dengan 1, maka!
mengembalikan true jika x sekarang 0 (atau NaN ...), salah jika tidak. Anda mungkin membaca idiom ini, seperti "kita mengurangi x dan jika itu membuatnya nol ..."Jika Anda ingin membuatnya lebih mudah dibaca, Anda dapat:
Cobalah:
Fiddle (Kode Coba)
sumber
Masalah sebenarnya di sini adalah kurangnya ruang antara dua operator
!
dan--
.Saya tidak tahu mengapa orang-orang berpikir bahwa Anda tidak dapat menggunakan ruang setelah
!
operator. Saya pikir itu berasal dari penerapan aturan spasi spasial mekanis bukannya akal sehat. Hampir setiap standar pengkodean yang saya lihat melarang spasi setelah semua operator unary, tapi mengapa?Jika ada kasus di mana Anda jelas membutuhkan ruang itu, ini adalah satu.
Pertimbangkan sedikit kode ini:
Tidak hanya dihaluskan
!
dan--
dihancurkan bersama-sama, Anda juga dapat(
membantingnya. Tidak heran sulit untuk mengatakan apa yang terhubung dengan apa.Spasi yang sedikit lebih membuat kode lebih jelas:
Tentu, jika Anda terbiasa dengan aturan mekanis seperti "tidak ada ruang di dalam parens" dan "tidak ada ruang setelah operator unary", ini mungkin tampak agak asing.
Tapi lihat bagaimana ruang spasi ekstra mengelompokkan dan memisahkan berbagai bagian dari
if
pernyataan dan ekspresi: Anda punya--pending
, jadi--
jelas operatornya sendiri dan terkait eratpending
. (Ini mengurangipending
dan mengembalikan hasil yang dikurangi.) Kemudian Anda!
memisahkannya sehingga jelas merupakan operator yang berbeda, meniadakan hasilnya. Akhirnya, Anda memilikiif(
dan)
mengelilingi seluruh ekspresi untuk membuatnya menjadiif
pernyataan.Dan ya, saya dihapus ruang antara
if
dan(
, karena(
milik keif
. Ini(
bukan bagian dari beberapa jenis(!--
sintaksis seperti yang tampak pada aslinya, bagian(
if dari sintaks dariif
pernyataan itu sendiri.Ruang kosong di sini berfungsi untuk mengkomunikasikan artinya , alih-alih mengikuti beberapa standar pengkodean mekanis.
sumber
!--
adalah beberapa operator javascript saya tidak tahu. Mengapa tidak menggunakan tanda kurung untuk membuatnya lebih eksplisit?if(!(--pending))
++
atau--
, tetapi banyak yang melarang menggunakan ruang yang tidak penting seperti setelah!
operator awalan, dan tanda kurung yang tidak penting.