详谈for循环里面的break和continue语句,深入探究node之Transform

break语句

本文详细的介绍了node Transform ,分享给大家,希望此文章对各位有所帮助。

此方法为借鉴别人的,在此只做记录。希望对大家也有用。

哇,我已经找到我要的答案了,我不需要进行更多的循环了!

Transform流特性

<input type="text" onkeyup="if(!/^\d+$/.test(this.value)) tip.innerHTML='必须输入数字,且不能有空格。'; else tip.innerHTML='';" />

比如,寻找第一个能被5整除的数:

在开发中直接接触Transform流的情况不是很多,往往是使用相对成熟的模块或者封装的API来完成流的处理,最为特殊的莫过于through2模块和gulp流操作。那么,Transform流到底有什么特点呢?

以上这篇解决html
input验证只能输入数字,不能输入其他的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

for循环中,如果遇见了break语句,这个for循环就会立即终止,不在进行其他的迭代了。

从名称上说,Transform意为处理,类似于生产流水线上的每一道工序,每道工序针对到来的产品作相应的处理;从结构上看,Transform是一个双工流,通俗的解释它既可以作为可读流,也可作为可写流。但是,node却对Transform流针对其特性做了更为特殊的定制,使Transform不是单纯的Duplex流。

您可能感兴趣的文章:

  • 使用正则限制input框只能输入数字/英文/中文等等
  • 『JavaScript』限制Input只能输入数字实现思路及代码
  • js实现文本框只允许输入数字并限制数字大小的方法
  • js限制文本框只能输入数字方法小结
  • js
    限制input只能输入数字、字母和汉字等等
  • JS限制文本框只能输入数字和字母方法
 for(var i = 1 ; i <= 100; i++){

    console.log(i);

    if(i == 5){

      break; //找到了一个,就立即终止循环

   }

 }

Transform流由于包含了Readable和Writeable特性,因此Transform在实际使用中有着多种方式:它既可以只作为消费者消费数据,也可同时作为生产者和消费者完成数据中间处理。下面将逐渐深入内部阐述Transform的运行机理及使用技巧。

break语句只能跳出当前所在的最内层循环:

Transform内部架构

 //break只中断了最内层循环,外层循环还在继续

 for(var i = 1 ; i <= 10 ; i++){

    for(var j = 1 ; j <= 10 ; j++){

      console.log(i,j);

     if(j == 5){

      break;

      }

   }

 }

图片 1

如果你这个break就是想终止所有的循环,那么JS中允许你给循环语句加label

上图表示一个Transform实例的组成部分:Readable部分缓冲(数组)、内部_read函数、Writeable部分缓冲(链表)、内部_write函数、Transform实例必须实现的内部_transform函数以及系统提供的回调函数afterTransform。由于Transform实例同时拥有两部分缓冲,因此2个缓冲的存储、消耗的顺序也就需要了解,这对于后面使用原生Transform编写代码有很大的指导意义。

 //break只能终止内层循环,但是我们就是想要终止外层循环

 //就要给外层循环加label:

 waiceng : for(var i = 1 ; i <= 10 ; i++){

    for(var j = 1 ; j <= 10 ; j++){

      console.log(i,j);

     if(j == 5){

      break waiceng; //break label的语法

      }

    }

 }

传统意义的流(即Readable和Writeable)的实现者都需要实现对应的内部函数_read()和_write(),对于Readable实例而言,_read函数用于准备从源文件中获取数据并添加到读缓冲中;对于Writeable实例_write函数则从写缓冲链表中一次刷入到磁盘中。它们分别对应了读写流程的首尾步骤,具体可以关注node中的Stream一文。

continue语句

而Transform中的_read和_write函数的实现大有不同,由于需要兼顾流的处理,因此着重分析Transform的内部函数执行流程。

呃,这个答案不是我想要的,赶紧试试下一个数字吧!

图片 2

遇见continue语句,for会立即终止执行后面的语句,然后进入下一次迭代了。

示例demo:

 for(var i = 1 ; i <= 100 ; i++){

    if(i == 5){

      continue;  //当i为5的时候,立即终止执行后面的console语句,直接i为6了。

   }

    console.log(i);

 }
readable.pipe(transform);

同样的,continue只能终端当前最内层的for,外层for要加label。

以上段示例代码为例,transform作为消费者消费readable。

break和continue的目的,就是优化算法的。

Transform的实例transform拥有transormState和readableState属性,保存了相关属性,如tranform状态信息、回调函数存储和编码等。transform作为消费者,会在其write函数中消费数据,在node中的Stream文中介绍了write函数的实现细节,通过内部调用_write函数实现数据的写入。而在Transform中_write函数已经重写:

寻找质数的方法:

1.保存transform收到的chunk数据、编码和函数(执行刷新写缓冲)

 <script type="text/javascript">

  //寻找2~100之内的所有质数

  waiceng :

  for(var i = 2 ; i <= 100 ; i++){

  //我们要测试i是不是质数,之前我们的算法是测试i的约数个数(不包括1和自己)

  //约数个数如果为0,那么就是质数。

  //凭什么我要测试约数个数??

  //只要你有约数,你就不是质数!!!!

     for(var j = 2 ; j <= Math.sqrt(i) ; j++){

       if(i % j == 0){

          continue waiceng; //如果这数字,被某一个数字整除了,那么立即放弃他

          //开始验证下一个i

       }

    }



     console.log(i); //如果一个数字有约数,就会执行continue,就遇不见这个语句了。

  }

 </script>

2.在一定条件下执行_read函数(当状态为非转换下,只要读缓冲大小未超过设定的大小,则执行_read)

发表评论

电子邮件地址不会被公开。 必填项已用*标注