for循环还能这么写!

前言

最近在阅读《JavaScript设计模式与开发实践》收获颇多☺,其中有一个让我很感兴趣的写法来分享一下。javascript

正文

各位掘友们是怎么写一个for循环的?
大多数是否是都会这么写。java

let arr = [1, 2, 3]
for (let i = 0, len = arr.length; i < len; i++) {
  // ...
}
复制代码

接下来秀一波操做设计模式

let arr = [1, 2, 3]
for (let i = 0, val; val = arr[i++]; ) {
  // ...
}
复制代码

第一眼见到她充满了好奇,为何她能够正常循环,并且能够正常终止呢?数组

带着疑问去查询了for循环的运行机制markdown

for (语句 1; 语句 2; 语句 3) {
  // 被执行的代码块
}
复制代码

能够看到正常的for循环有3个语句,先来解释一下
语句1(可选):用于初始化变量
语句2(可选):条件判断,若是为true继续,若是为false退出循环
语句3(可选):改变初始变量的值,用于条件判断函数

看完了这几个语句的做用就能够明白为何上面的循环能够正常操做了吧,val = arr[i++]是一个判断条件语句(同时起到了赋值i++的做用),从arr[i++]中拿出来的值如判断为true则能够继续循环,若判断为false,就终止循环。spa

扩展

啰嗦 😂
那这一段会输出什么值呢?设计

let arr = [1, 2, 0, 3]
for (let i = 0, val; val = arr[i++]; ) {
  // ...
}
复制代码

答案:只会输出12
缘由:当i=2的时候取出来的值是0,ta是会被断定为false的,因此就退出循环。
如何解决这种状况呢,本身手写判断条件。code

let arr = [1, 2, 0, 3]
for (let i = 0, val; ; ) {
  val = arr[i++]
  if (val === undefined) {
    break
  } else {
    // ...
  }
}
复制代码

总结

for循环的运行机制,嗯挺香的。orm

对数组里的数据不自信的千万不要这么写
对数组里的数据不自信的千万不要这么写
对数组里的数据不自信的千万不要这么写

仰望《JavaScript设计模式与开发实践》这本书的做者,满页的for循环骚操做(逼格挺高),仍是很敬佩做者能够写出这么好的文章,感谢做者为社区作出的贡献。

书中使用这种for循环的时候,数组中的数据基本上都是回调函数,因此不存在数据值的判断条件会为false状况

喜欢的大佬们动动手指点个赞关注一下☺

相关文章
相关标签/搜索