function andMultipleExpr(){
let logicalAnd;
let i;
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));
내가 기대하는 것은이 코드를 실행하는 것입니다 : true && true && false && false 그리고 그것은 false 를 반환해야합니다 .
js에서 어떻게 작동하게합니까? 감사
답변
Array.prototype.every
전달 된 모든 인수에 사용 하여 모두 인수인지 확인하십시오.
function andMultipleExpr(...a) {
if(a.length === 0) return false; // return false when no argument being passed
return a.every(Boolean);
}
console.log(andMultipleExpr(true, true, false)); // should return false
console.log(andMultipleExpr(true, true, true)); // should return true
답변
당신은 필요
-
로
logicalAnd
설정하여 시작true
-
logicalAnd
두 항목을 사용하지 않고 업데이트 할 때 사용arguments
최소한의 변화는 다음과 같습니다.
function andMultipleExpr(){
let logicalAnd = true; // ***
let i;
for (i = 0; i < arguments.length; i++){
logicalAnd = logicalAnd && arguments[i]; // ***
}
return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));
그러나 mbojko의 솔루션 은 단락의 장점이 있습니다 (처음 잘못된 값을 발견하면 루프를 중지). 이는 좋은 생각입니다.
ES2015 +를 사용하고 있으므로 아마 rest 매개 변수를 사용해야합니다 arguments
를 사용해야하며 for-of
루프를 사용할 수 있습니다 .
function andMultipleExpr(...flags) {
let logicalAnd = true;
for (const flag of flags) {
logicalAnd = logicalAnd && flag;
}
return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));
mbojko의 접근 방식 에 따라 단락시킬 수도 있습니다.
function andMultipleExpr(...flags) {
for (const flag of flags) {
if (!flag) {
return false;
}
}
return true;
}
console.log(andMultipleExpr(true, true, false, false));
어떤 사람들은 reduce
이것을 던질 수도 있지만 Archie의 every
솔루션 이 훨씬 좋습니다. (그러나 비교가 엄격하지 않기 때문에 그냥 만들 것입니다..every(flag => flag)
입니다.)
답변
초기 반품은 코드를보다 효율적이고 짧게 만들어야합니다.
function andMultipleExpr() {
for (let i = 0; i < arguments.length; i++) {
if (!arguments[i]) {
return false;
}
}
return true;
}
답변
나는 이것이 ES6을 사용 하는 매우 짧은 방법 이라고 생각합니다. Array.prototype.reduce
let andMultipleExpr = (...args) => args.reduce((a, b) => a && b);
console.log(andMultipleExpr(true, true, false, false));
기능 축소에 대한 자세한 내용은 MDN을 참조하십시오
답변
당신은 걸릴 수 있습니다 Array#every
마지막 값을 반환 .
이 접근법은 논리 AND 의 실제 결과를 반환합니다.&&
.
이 접근 방식을 사용하면 처음 발견 된 잘못된 값에 대해 단락이 발생합니다. 그런 다음 반복이 중지됩니다.
function andMultipleExpr(...args) {
var result; // any return value is configurable for empty args
args.every(v => result = v);
return result;
}
console.log(andMultipleExpr(true, true, false, false));
console.log(andMultipleExpr(true, true, 1, 2));
console.log(andMultipleExpr(true, 0, 1, 2));
답변
아마도 루프에서 무엇이 잘못되었는지 듣고 싶을 것입니다.
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
빈 인수 목록 을 작성하는 것을 목표로했습니다 .)