小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
刷leetcode的时候遇到了这个问题,大部分的解决方案都是改用for循环,本文在他们思路上扩展一些其他的解决的方案。
原理以及为什么会出现这种问题
Array.prototype.myEach = function(callback) {
for (var i = 0; i < this.length; i++)
callback(this[i], i, this);
};
forEach
在使用是其实是回调函数在进行真正的操作,进行数组遍历的for
循环是定义在forEach
里面的而我们添加的break
或return
只是写在了callback
里面,和for循环并不在同一个作用域所以是不生效的。
替换
改for循环:
这里就不做赘述了
for...of
遍历
ES6引入的循环方法,for...of
循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、Generator 对象,以及字符串。
for...of
可以正确响应break、continue和return,for...of
循环读取键值。循环读取键值,对应的for...in
循环读取键名。
var nums = [2, 2, 2, 2, 2, 2, 9, 9, 9, 9]
var target = 9
var forof = function (nums, target) {
for (var alue of nums) {
if (alue == target) {
return alue
}
console.log(alue)
}
}
console.log(forof(nums, target))
可以看到for...of
正确响应了return。
不替换
通过try···catch
捕获异常,实现不替换forEach
达到终止循环。
var nums = [2, 2, 2, 2, 2, 2, 9, 9, 9, 9]
var target = 9
var forof = function (nums, target) {
try {
nums.forEach((element, i) => {
if (element == target) {
throw new Error('0') //抛出错误
}
console.log(element)
})
} catch (e) {
if (e.message == '0') {
console.log(true)
}
}
}
console.log(forof(nums, target))
如上成功终止循环。