我知道这种行为是众所周知的并且有很好的记录: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
除了by之外,没有办法停止或中断forEach()循环 抛出一个例外。如果需要这样的行为,请使用forEach()方法 是错误的工具,而是使用普通循环。如果你正在测试 你需要一个谓词的数组元素并需要一个布尔返回值 可以使用every()或some()代替。如果可用,新方法 find()或findIndex()可以在true时用于提前终止 也是谓词。
var theSecond = findTheSecond()
console.log('theSecond is: ' + theSecond)
function findTheSecond(){
[1,2,3].forEach(function(e1) {
console.log('Item:' + e1)
if(e1 === 2) {
return(e1)
}
});
}

我的问题是为什么JavaScript设计得像这样?这是对语言的疏忽或故意设计决定吗?
答案 0 :(得分:2)
这些函数迭代器方法不会像普通的“for”循环一样“破坏”,可能是因为当你想要“forEach”时,他们可能会认为你故意想要为数组中的每个“值”做一些事情。要在“找到”正确的项目中执行您想要执行的操作,可以使用“查找”
var theSecond = findTheSecond();
console.log('theSecond is: ' + theSecond)
function findTheSecond(){
return (
[1,2,3].find(function(e1) {
console.log('Item: ', e1);
return e1 === 2
})
)
}
忘记必要的“for循环”,获得“功能”!阵列上有很多方法可供选择,即map,reduce等。
答案 1 :(得分:0)
如果需要,您可以使用Array#some
快捷方式。
var theSecond = findTheSecond();
console.log('theSecond is: ' + theSecond);
function findTheSecond() {
var result;
[1, 2, 3].some(function (el, i) {
console.log('Item:' + el);
if (i === 1) {
result = el;
return true;
}
});
return result;
}