Thinking系列,旨在利用10分钟的时间传达一种可落地的编程思想或解决方案。
规范地址(下述引用文,均源自该规范):https://tc39.es/ecma262/#sec-array.prototype.foreach
跳过不存在的元素
callbackfn 只对数组中实际存在的元素调用;数组中缺少元素时不调用该函数。
forEach
calls callbackfn once for each element present in the array, in ascending order. callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.
元素值为 undefined,callbackfn
正常执行;元素值缺失,callbackfn
直接跳过。
callbackfn 中新增加的元素不会被处理
在 forEach 调用开始后,追加到数组中的元素将不会被 callbackfn 访问。
Elements which are appended to the array after the call to
forEach
begins will not be visited by callbackfn.
执行了2次,但 ary 最终变成了 [1, 2, 2, 3]
。
callbackfn 中变更元素
① 如果数组中已有的元素被改变了,它们传递给 callbackfn 的值将是 forEach 访问它们时的值。
If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time
forEach
visits them;
执行输出结果为 1 3
,callbackfn
获取的值为实时访问的值(修改后的值)。
② 在开始调用 forEach 之后和访问之前被删除的元素不会被访问。
elements that are deleted after the call to
forEach
begins and before being visited are not visited.
执行输出结果为 1
,callbackfn
中删除的元素不再被访问。
终止执行
在 forEach
中用 return
不会返回,函数会继续执行。
return 并不会停止执行后续的操作。
原因: 仔细查看就会发现,return
结束的是当前 callbackfn
,并不是 forEach
函数本身。
解决方案:
① 使用 try
监视代码块,在需要中断的地方抛出异常;
② 官方推荐方法(替换方法),用 every
和 some
替代 forEach
函数 – every
在碰到 return false
的时候,中止循环;some
在碰到 return true
的时候,中止循环。
【重点】异步执行
模拟异步函数
存在数组 const ary = [3, 2, 1]
,期望按照顺序输出 3 2 1
。
ECMA262规范:
callbackfn
的执行无法保证顺序(异步),所以会导致上述问题。
解决方案: 使用 for...of
for...of
并不是简单的遍历执行,而是通过迭代器去遍历 Array.prototype[Symbol.iterator]()
。
规范地址:https://tc39.es/ecma262/#sec-for-in-and-for-of-statements
for...of
的实现
执行完成当前值,才会调用下一个 next
。
再延伸一下,生成器 yield
也是迭代器
实现斐波那契