forEach回调的返回值在哪里?

时间:2016-12-07 19:39:59

标签: javascript

...更具有说服力,是否有可能打破forEach循环。在下面的代码中,if语句中的return语句似乎什么都不做。

这是因为它重新调回回调函数。

以下是参考资料:

msdn - forEach

// underscore equivalent "cornerstone" fails b.c. of storage duality
var newForEach = function (obj, func, con) {
    if (Pub.isType("Function", func)) {
        Object.keys(obj).forEach(function (key) {
            if (func.call(con, obj[key], key, obj)) {
                return true;
            }
        });
    }
};

注意,我对使用其他方法不感兴趣。我很好奇返回值

2 个答案:

答案 0 :(得分:0)

返回值无处可去。

如果您想要突破forEach,请改用some。当你返回真值时,它会中断。

取自MDN documentation on forEach

  

除了抛出异常之外,无法停止或中断forEach()循环。如果您需要这样的行为,forEach()方法是错误的工具,请使用普通循环。如果要测试谓词的数组元素并需要布尔返回值,则可以使用every()some()代替。如果可用,新方法find()findIndex()也可用于在谓词上提前终止。

答案 1 :(得分:0)

您可以突破循环,但返回值未使用。

由于forEach本身并没有返回任何内容,因此从回调中收集返回值是没有多大意义的。

要突破,您需要在回调期间throw

var newForEach = function (obj, func, con) {
    if (Pub.isType("Function", func)) {
        Object.keys(obj).forEach(function (key) {
            if (func.call(con, obj[key], key, obj)) {
                throw new Error('something terrible happened!');
            }
        });
    }
};

然而,看起来像流量控制的异常,这是一件非常糟糕的事情。如果这就是您正在做的事情,可能还有其他更有用的数组方法:可能是everyfilter

相关问题