나는 지금 운동을하고 있는데 왜 이것이 정의되지 않은 것으로 반환되는지 알 수 없습니다.
function every(array, compare) {
var newArray = array.filter(
function(property) {
return compare(property);
}
);
if (newArray === undefined || newArray.length == 0) {
return false;
}
}
console.log(every([NaN, NaN, NaN], isNaN));
// → true
console.log(every([NaN, NaN, 4], isNaN));
// → false
보시다시피, 저는 참과 거짓을 가져야하지만 대신 정의되지 않고 정의되지 않습니다. 왜 그렇습니까? isNaN을 제대로 이해하지 못해서 그런 것 같지만 100 % 확실하지 않습니다.
isNaN
인수가 NaN
일 때 true를 반환하면 필터 함수가의를 유지 NaN
하지만 다른 모든 것을 제거 한다는 의미입니다 . 길이는 0
배열에 NaN이없는 경우 에만 가능합니다. 이러한 배열의 경우 함수는 false를 반환합니다.
console.log(every([4], isNaN)); // false
그것은 당신이 원하는 것과 반대되는 것 같습니다. 함수를 호출 every
했지만 호출해야하는 것처럼 작동합니다 some
.
다른 모든 경우에는 return 문이 없기 때문에 undefined
(대신 true
) 반환됩니다. 유일한 return 문은 if 문 안에 있으므로 조건이 진실하지 않으면을 반환합니다 undefined
. 이를 수정하는 한 가지 방법은 비교 결과를 반환하도록 변경하는 것입니다 newArray.length === array.length
.
function every (array, compare){
var newArray = array.filter(
function (property){
return compare(property);
}
);
return newArray.length === array.length;
}
console.log(every([NaN, NaN, NaN], isNaN));
// → true
console.log(every([NaN, NaN, 4], isNaN));
// → false
대안은 compare
필터 콜백 내부 의 반환 값을 부정하는 것입니다 (@Shomz의 답변 참조) return newArray.length === 0;
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다