Belki de döngüde neyin yanlış gittiğini duymak istersiniz:
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
- bu döngü
&&
karşılaştığı son iki öğeyi saklar . İdeal durumda &&
, dizinin son iki öğesini birlikte kullanırsınız (bu zaten ihtiyacınız olan şey değildir)
- bunun üstünde, döngünün sonunda
i=arguments.length-1
, dizinin son öğesini kontrol eder ve sonuncusu olan i+1
"after" elemanıdır undefined
. Mantıksal ilişkiler açısından düşünülür false
, ancak &&
böyle bir durumda değerin kendisini üretir ve bu nedenle işlev undefined
her zaman geri döner (bu soruda belirtilebilirdi).
Dokümanlar
expr1 && expr2
: Eğer expr1
dönüştürülebilirse true
, döndürür expr2
; yoksa geri döner expr1
.
arr=[true];
console.log("your case:",arr[0] && arr[1]);
console.log("1 && 2:", 1 && 2);
Bunun yerine,
logicalAnd
bir
&&
önceki öğelerin tamamının sonucunu toplayan bir akümülatör olarak kullanmalısınız ve kullanabileceğiniz bir hile, kısmi bir sonuç
&&
ise
false
, kalan öğelerin ne olduğu önemli değil, sonuç olacak
false
, böylece döngü hemen durabilir:
function andMultipleExpr(){
let logicalAnd = arguments[0] || false;
for (let i = 1; i < arguments.length && logicalAnd; i++){
logicalAnd = logicalAnd && arguments[i];
}
return logicalAnd;
}
console.log("():",andMultipleExpr());
console.log("(false):",andMultipleExpr(false));
console.log("(true):",andMultipleExpr(true));
console.log("(true,true):",andMultipleExpr(true,true));
console.log("(true, true, false, false):",andMultipleExpr(true, true, false, false));
ve bunu Archie'nin cevabına göre optimize edebilirsiniz : &&
-ing öğelerinin sonucu, true
tüm öğelerin olması true
ve &&
sonucu hesaplamak için tek bir işlem yürütmeniz gerekmemesidir :
function andMultipleExpr(){
if(arguments.length===0){
return false;
}
for (let i = 0; i < arguments.length; i++){
if(!arguments[i]){
return false;
}
}
return true;
}
console.log("():",andMultipleExpr());
console.log("(false):",andMultipleExpr(false));
console.log("(true):",andMultipleExpr(true));
console.log("(true,true):",andMultipleExpr(true,true));
console.log("(true, true, false, false):",andMultipleExpr(true, true, false, false));
(Yukarıdaki pasajlarda false
boş bir argüman listesi oluşturmayı amaçladım .)