아마도 루프에서 무엇이 잘못되었는지 듣고 싶을 것입니다.
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
의 결과를 수집하는 누적 기 (accumulator)로 사용해야 하며
&&
, 부분 결과가 다음과 같은 경우 사용할 수있는 트릭
&&
입니다.
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의 답변 으로 최적화 할 수 있습니다 . &&
-ing 항목 의 결과는 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
빈 인수 목록 을 작성하는 것을 목표로했습니다 .)