Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个函数返回未定义?_Javascript - Fatal编程技术网

Javascript 为什么这个函数返回未定义?

Javascript 为什么这个函数返回未定义?,javascript,Javascript,我现在正在做一个练习,我不明白为什么会返回未定义 function every(array, compare) { var newArray = array.filter( function(property) { return compare(property); } ); if (newArray === undefined || newArray.length == 0) { return f

我现在正在做一个练习,我不明白为什么会返回未定义

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
,但删除了其他所有内容。如果数组中没有NaN,则其长度仅为
0
。对于这样的数组,函数返回false:

console.log(every([4], isNaN)); // false
这似乎与你想要的正好相反。您每次调用函数
,但它的行为更像是应该调用
some

对于其他所有内容,它都返回
undefined
(而不是
true
),因为在任何其他情况下都没有返回语句。唯一的return语句在if语句中,因此如果条件不是truthy,它将返回
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
另一种方法是在过滤器回调(请参见@Shomz的答案)中对
compare
的返回值求反,然后
returnnewarray.length==0

if (newArray === undefined || newArray.length == 0)
    return false;
仅当新数组为空或未定义时,才会触发此操作。否则,函数返回未定义的
。修复此问题,并反转回调函数的返回,因为当值不是数字时,
isNaN
为真

请看这里:

每个函数(数组、比较){
var newArray=array.filter(
功能(属性){
返回!比较(属性);
}
);
返回newArray.length==0;
}
log(每个([NaN,NaN,NaN],isNaN));
// → 真的
log(每([NaN,NaN,4],isNaN));

// → false
如果
未运行,会发生什么情况?默认情况下,函数返回
未定义的
我应该得到true和false
-函数何时返回
true
?请注意
过滤器中的
返回
并不是从
每个
函数返回,它只是确定过滤器结果(对于单个数组元素).
return array.filter(compare).length
您不应该使用
filter
来实现
every
。使用普通循环。如果您想使用内置方法,请选择
every
,如果您不想破坏乐趣,请使用
reduce
实现它。注意
newArray===undefined
是不可能的,因为永远不会返回
undefined
。条件也可以缩短为
newArray.length==0
@Paulpro,这是事实,谢谢。基本上,OP只需要更改return语句。我会更新我的答案。@Jeffburghes不客气,我很乐意帮忙!虽然我认为Paulpro的答案更好。啊,事实上是这样的。我甚至没有意识到还有其他答案。当我开始写我的答案时,我看不到你的答案。这就是所需要的。