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 undefinedher zaman geri döner (bu soruda belirtilebilirdi).
Dokümanlar
expr1 && expr2: Eğer expr1dö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,
logicalAndbir
&&ö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, truetüm öğelerin olması trueve &&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 falseboş bir argüman listesi oluşturmayı amaçladım .)