...更具有说服力,是否有可能打破forEach循环。在下面的代码中,if语句中的return语句似乎什么都不做。
这是因为它重新调回回调函数。
以下是参考资料:
// 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;
}
});
}
};
注意,我对使用其他方法不感兴趣。我很好奇返回值。
答案 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!');
}
});
}
};
然而,看起来像流量控制的异常,这是一件非常糟糕的事情。如果这就是您正在做的事情,可能还有其他更有用的数组方法:可能是every
或filter
。