为什么这个函数返回undefined?

时间:2016-05-03 00:43:11

标签: javascript

我现在正在做一个练习,但我无法弄清楚为什么这个回复未定义。

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%肯定。

2 个答案:

答案 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;