我现在正在做一个练习,但我无法弄清楚为什么这个回复未定义。
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%肯定。
答案 0 :(得分:2)
if (newArray === undefined || newArray.length == 0)
return false;
仅当您的新数组为空或未定义时,才会触发此操作。否则该函数返回undefined
。修复此问题并反转回调函数的返回值,因为当值不是数字时isNaN
为真。
见这里:
function every(array, compare) {
var newArray = array.filter(
function(property) {
return !compare(property);
}
);
return newArray.length == 0;
}
console.log(every([NaN, NaN, NaN], isNaN));
// → true
console.log(every([NaN, NaN, 4], isNaN));
// → false

答案 1 :(得分:1)
isNaN
当它的参数为NaN
时返回true,这意味着您的过滤器函数保留NaN
但删除其他所有内容。如果数组中没有NaN,则其长度仅为0
。对于这样的数组,您的函数返回false:
console.log(every([4], isNaN)); // false
这似乎与你想要的相反。您调用了函数every
,但它更像是应该调用some
。
对于其他所有内容,它返回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;
。