Có lẽ bạn muốn nghe những gì đã xảy ra với vòng lặp:
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
- vòng lặp này lưu trữ
&&
hai mục cuối cùng mà nó gặp phải. Trong trường hợp lý tưởng, nó sẽ &&
kết hợp hai phần tử cuối cùng của mảng (vốn không phải là thứ bạn cần)
- ở trên cùng ở cuối vòng lặp
i=arguments.length-1
, nó sẽ kiểm tra phần tử cuối cùng của mảng và i+1
là phần tử "sau" phần tử cuối cùng undefined
. Về mặt quan hệ logic, nó được xem xét false
, nhưng tự &&
tạo ra giá trị trong trường hợp đó và đó là lý do tại sao hàm trả về undefined
mọi lúc (điều này có thể đã được đề cập trong câu hỏi).
Tài liệu
expr1 && expr2
: Nếu expr1
có thể được chuyển đổi thành true
, trả về expr2
; khác, trả lại expr1
.
arr=[true];
console.log("your case:",arr[0] && arr[1]);
console.log("1 && 2:", 1 && 2);
Thay vào đó, bạn nên sử dụng
logicalAnd
như một bộ tích lũy, thu thập kết quả của
&&
-ing tất cả các phần tử trước đó và một mẹo mà bạn có thể sử dụng là nếu kết quả của một phần
&&
là
false
, không quan trọng các phần tử còn lại là gì, kết quả cuối cùng là gì sẽ xảy ra
false
, vì vậy vòng lặp có thể dừng ngay lập tức:
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));
và sau đó bạn có thể tối ưu hóa nó theo câu trả lời của Archie : kết quả của &&
các mục -ing là true
nếu tất cả các mục là true
và bạn không phải thực hiện một &&
thao tác duy nhất để tính kết quả:
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));
(Trong đoạn trích ở trên, tôi nhắm đến việc tạo ra false
một danh sách đối số trống.)