function andMultipleExpr(){
let logicalAnd;
let i;
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));
Apa yang saya harapkan adalah mengeksekusi kode ini: true && true && false && false dan itu seharusnya mengembalikan false .
Bagaimana cara membuatnya di js? Terima kasih
javascript
function
Hakim Asa
sumber
sumber
andMultipleExpr(1, 1, 0, 0)
atauandMultipleExpr(1, 1, 1, 1)
andMultipleExpr()
(Memanggil fungsi tanpa parameter)?Jawaban:
Gunakan
Array.prototype.every
pada semua argumen yang diteruskan untuk memeriksa apakah semuanya benar;sumber
e => e === true
denganBoolean
true
.===
dalam kode OP. Namun,every
ide Anda tepat . Tapi.every(e => e)
lakukan saja pekerjaannya.const isTrue = x => x === true
(ataux => !!x
untuk semua nilai kebenaran), Anda dapat memampatkan solusi Andareturn arguments.every(isTrue)
. Yang bagi saya tampaknya hanya indah.Kamu butuh
Mulai dengan
logicalAnd
set ketrue
Gunakan
logicalAnd
saat memperbaruinya, daripada menggunakan dua entri dariarguments
Perubahan minimal adalah:
Tetapi solusi mbojko memiliki keuntungan dari hubungan arus pendek (menghentikan loop ketika pertama kali menemukan nilai palsu), yang sepertinya ide yang bagus.
Karena Anda menggunakan ES2015 +, Anda mungkin harus menggunakan parameter lainnya daripada
arguments
, dan Anda dapat menggunakanfor-of
loop:Anda juga dapat melakukan hubungan pendek yang sesuai dengan pendekatan mbojko
Beberapa orang mungkin setuju
reduce
dengan hal ini, tetapi solusi Archieevery
jauh lebih baik. (Tapi karena perbandinganmu tidak ketat, aku akan membuatnya.every(flag => flag)
.)sumber
[].reduce((a,b)=>a && b)
melempar.Pengembalian awal harus membuat kode lebih efisien dan lebih pendek:
sumber
Saya pikir ini cara yang sangat singkat menggunakan ES6
Array.prototype.reduce
Untuk penjelasan lebih lanjut tentang pengurangan fungsi, silakan baca MDN
sumber
every
seperti yang dilakukan Archie daripadareduce
. Lebih sederhana, dan sirkuit pendek.every
untuksome
. Masih lebih sederhana. Masih hubungan arus pendek.Anda bisa mengambil
Array#every
dan mengembalikan nilai terakhir.Pendekatan ini mengembalikan hasil nyata dari AND
&&
.Dengan menggunakan pendekatan, hubung singkat dibuat untuk nilai falsy pertama yang ditemukan. Kemudian iterasi berhenti.
sumber
Mungkin Anda ingin mendengar apa yang salah dengan loop:
&&
dua item terakhir yang dihadapinya. Dalam kasus ideal ini akan&&
menyatukan dua elemen terakhir dari array (yang sudah bukan yang Anda butuhkan)i=arguments.length-1
, itu akan memeriksa elemen terakhir dari array, dani+1
merupakan elemen "setelah" yang terakhir, yaituundefined
. Dalam hal hubungan logis, itu dianggapfalse
, tetapi&&
menghasilkan nilai itu sendiri dalam kasus seperti itu, dan itulah sebabnya fungsi kembaliundefined
sepanjang waktu (ini bisa saja disebutkan dalam pertanyaan).Documents
Sebaliknya, Anda harus menggunakan
logicalAnd
sebagai akumulator, yang mengumpulkan hasil dari&&
-semua elemen sebelumnya, dan trik yang dapat Anda gunakan adalah jika hasil dari sebagian&&
adalahfalse
, tidak masalah apa elemen yang tersisa, hasil akhirnya akan jadifalse
, sehingga loop dapat segera berhenti:dan kemudian Anda dapat mengoptimalkannya terhadap jawaban Archie : hasil dari
&&
item -ing adalahtrue
jika semua itemtrue
, dan Anda tidak harus menjalankan&&
operasi tunggal untuk menghitung hasilnya:(Dalam cuplikan di atas saya bertujuan untuk menghasilkan
false
daftar argumen kosong.)sumber