บางทีคุณอยากได้ยินสิ่งผิดปกติกับลูป:
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
- การวนซ้ำนี้จัดเก็บ
&&
รายการสองรายการสุดท้ายที่พบ ในกรณีอุดมคติมันจะ&&
รวมสององค์ประกอบสุดท้ายของอาร์เรย์ (ซึ่งไม่ใช่สิ่งที่คุณต้องการ)
- ด้านบนของที่ในตอนท้ายของวง
i=arguments.length-1
ก็จะตรวจสอบองค์ประกอบสุดท้ายของอาร์เรย์และi+1
เป็นองค์ประกอบ "หลัง" undefined
คนสุดท้ายซึ่งเป็น ในแง่ของความสัมพันธ์เชิงตรรกะจะพิจารณาfalse
แต่&&
สร้างมูลค่าของตัวเองในกรณีเช่นนี้และนั่นคือเหตุผลที่ฟังก์ชั่นส่งคืนundefined
ตลอดเวลา (นี้อาจได้รับการกล่าวถึงว่าในคำถาม)
เอกสาร
expr1 && expr2
: หากexpr1
สามารถแปลงเป็นtrue
ผลตอบแทนexpr2
; expr1
อื่นผลตอบแทน
arr=[true];
console.log("your case:",arr[0] && arr[1]);
console.log("1 && 2:", 1 && 2);
แต่คุณควรใช้
logicalAnd
เป็นตัวสะสมซึ่งจะรวบรวมผลลัพธ์ของ
&&
องค์ประกอบทั้งหมดก่อนหน้านี้และเคล็ดลับที่คุณสามารถใช้คือถ้าผลลัพธ์ของบางส่วน
&&
คือ
false
มันไม่สำคัญว่าองค์ประกอบที่เหลือคืออะไรผลลัพธ์สุดท้าย เป็นไปได้
false
ดังนั้นลูปสามารถหยุดได้ทันที:
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));
และจากนั้นคุณสามารถปรับให้เหมาะสมกับคำตอบของ Archie : ผลลัพธ์ของ&&
รายการไอเอ็นจีคือtrue
ถ้าทุกรายการเป็นtrue
และคุณไม่จำเป็นต้องดำเนินการเดียว&&
สำหรับการคำนวณผลลัพธ์:
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));
(ในตัวอย่างด้านบนฉันตั้งเป้าที่จะสร้างfalse
รายการอาร์กิวเมนต์เปล่า)