飄風不終朝,驟雨不終日。——《道德經》
简介
在Array.prototype
上有很多方法,比较常用的就是every
、filter
、forEach
、map
、some
这些循环方法,可以通过break
、comtinue
跳出循环?
现在基本上都是通过forEach
、every
来代替for
循环,for
循环可以通过break
、continue
跳出循环。而 forEach 可以不可以呢,下面一步一步的验证一下。
for
在for
中遇到break
就会退出当前循环,后面的循环不会再执行。代码如下
1 | let arr = [1, 2, 3, 4, 5]; |
在for
中遇到continue
就会退出当前本次循环,后面的循环会执行。代码如下
1 | let arr = [1, 2, 3, 4, 5]; |
在
for
中不能使用 return,不然会报错
forEach、every、some、filter、map
如果想退出forEach
,就只能通过return
, 它会退出当前本次循环,后面的循环会执行。代码如下
1 | var arr = [1, 2, 3, 4, 5]; |
如果想退出every
,就只能通过return
, 它会退出当前循环,后面的循环不会再执行。代码如下
1 | var arr = [1, 2, 3, 4, 5]; |
如果想退出some
,就只能通过return
, return false
和return true
它的表现是不一致的。return false
它的表现和forEach
中的表现一致。 代码如下
1 | var arr = [1, 2, 3, 4, 5]; |
return true
和every
表现一致,代码如下:
1 | var arr = [1, 2, 3, 4, 5]; |
如果想退出filter
,就只能通过return
, 它会退出当前本次循环,后面的循环会执行。代码如下
1 | var arr = [1, 2, 3, 4, 5]; |
如果想退出map
,就只能通过return
, 它会退出当前本次循环,后面的循环会执行。代码如下
1 | var arr = [1, 2, 3, 4, 5]; |
在
forEach
、every
、some
中不能用break
、continue
跳出循环,不然会报错。
都知道filter
、map
会返回一个新的数组,而every
、some
会返回一个Boolean
类型的。
some 和 every 需要注意的地方
some()
方法测试是否至少有一个元素可以通过被提供的函数方法。该方法返回一个 Boolean 类型的值。polyfill
实现如下:
1 | Array.prototype.some = function (callbackfn, thisArg) { |
可以看出,遇到回调返回值是 true
的话,函数就直接返回、结束了。这是种短路算法,并不是所有回调都执行一遍,然后再最后求所有与值。every
也类似,不过与之相反,遇到回调返回值是 false
时,整体就直接返回 false
了。
从实现上表达出的语义来讲,some
是在说:有一个成功,我就成功,而 every
是在说:有一个失败,我就失败
另外要强调一点,对于稀疏数组,不存在的索引值时,回调函数是不执行的。