【问题标题】:Javascript isNaN returning undefined when passed as argumentJavascript isNaN 在作为参数传递时返回 undefined
【发布时间】:2016-03-02 20:58:50
【问题描述】:

我正在自己练习 Javascript,我有一个问题。

我创建了一个名为 "every" 的函数,它接受 2 个参数。 第一个参数是一个数组,第二个参数是一个布尔函数。 “每个”函数的作用是将布尔函数应用于数组中的每个元素,如果每个元素都返回 true,并且“每个”函数返回 true,否则返回 false。

例如,

console.log(every([NaN, NaN, NaN], isNaN));
// → true
console.log(every([NaN, NaN, 4], isNaN));
// → false

我想出了一个解决方案,它奏效了。

function every(array, bool) {
    for (var i = 0; i < array.length; i++) {
        if (!bool(array[i]))
            return false;
    }
    return true;
}

但是,我尝试将 forEach 合并到函数中并想出了这个

function every(array, bool) {
    array.forEach(function(element) {
        if(!bool(element)) 
            return false;
    });
    return true;
}

但第二个不起作用。我用http://www.pythontutor.com/跟踪每个执行步骤 并发现函数的“bool(element)”部分给了我未定义的而不是真或假。 所以我的问题是为什么它给我未定义?因为在这种情况下 bool(element) 应该与 isNaN(element) 相同。

【问题讨论】:

    标签: javascript arguments undefined higher-order-functions


    【解决方案1】:

    .forEach() 版本中的 return 语句从 .forEach() 回调返回,而不是从您的封闭函数返回。

    对于.forEach(),您的应用程序并不是一个很好的用例。您并不真的想为数组中的 每个 元素执行函数:您只想处理数组直到第一个 false 元素。 Array 原型已经有一个.every(),所以你可以使用它,但是你的函数的整个点都会有问题:)

    【讨论】:

    • 如果我想让第二个版本正常工作,我该怎么做?
    • @user3248608 好吧,你可以让回调函数在闭包中设置一个标志,但是这样做没有什么意义——在这种情况下你真的需要一个简单的for 循环。
    猜你喜欢
    • 1970-01-01
    • 2018-04-09
    • 2022-11-24
    • 2017-11-02
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    相关资源
    最近更新 更多