今天在leetCode上刷第一道两数之和的算法题时,遍历nums数组时想用forEach,希望在找到两数和时返回结果并结束forEach循环,代码如下:
var twoSum = function(nums, target) {
const map = {}
nums.forEach((item, index) => {
if(map[target - item] === undefined) map[item] = index
else return [map[target - item], index]
})
};
console.log(twoSum([2,7,11,15], 9)) // 发现打印的是undefined
最后发现是forEach里的return是无效,他可以起到类似continue关键字的作用,只能跳过该次循环,不会结束循环,看下面例子:
[1,2,3,4,5].forEach(item => {
if(item === 3) return
console.log(item)
})
// 只跳过了第三次循环
1
2
4
5
试着换成break和continue报错
[1,2,3,4,5].forEach(item => {
if(item === 3) break
console.log(item)
})
Uncaught SyntaxError: Illegal continue statement: no surrounding iteration statement
这是几年之前的V8 forEach源码,他通过循环数组调用传入的f方法去实现forEach,那么每一次循环都是一个f方法的执行,所以在forEach里面return只是结束了一次f方法的继续往下执行。因为f里面没有循环所以写break和continue都会报错
function InnerArrayForEach(f, receiver, array, length) {
if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f);
if (IS_UNDEFINED(receiver)) {
for (var i = 0; i < length; i++) {
if (i in array) {
var element = array[i];
f(element, i, array);
}
}
} else {
for (var i = 0; i < length; i++) {
if (i in array) {
var element = array[i];
%_Call(f, receiver, element, i, array);
}
}
}
}
最后上面的算法题我通过for循环来解决了
var twoSum = function(nums, target) {
const map = {}
for(let i = 0; i < nums.length; i++){
const item = nums[i]
if(map[target - item] === undefined) map[item] = i
else return [map[target - item], i]
}
};