EasyScript 开发者指南
与多数语言不同的是,EasyScript中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构,关键字 for 的基本使用方法与C/C++中非常接近
var sum = 0;
for( var i = 0; i < 10; i++) {
    sum += i;
}
EasyScript还进一步考虑到无限循环的场景,让开发者不用写无聊的 for(;;){}和do{} while(1);,而直接简化为如下的写法:
var sum = 0;
for {
    sum++;
    if (sum > 100) {
        break;
    }
}
for 中的初始语句——开始循环时执行的语句
初始语句是在第一次循环前执行的语句,一般使用初始语句执行变量初始化,如果变量在此处被声明,其作用域将被局限在这个 for 的范围内。

初始语句可以被忽略,但是初始语句之后的分号必须要写,代码如下:
var step = 2;
for( ; step > 0; step--) {
    log.Println(step);
}
这段代码将 step 放在 for 的前面进行初始化,for 中没有初始语句,此时 step 的作用域就比在初始语句中声明 step 要大。
for 中的条件表达式——控制是否循环的开关
每次循环开始前都会计算条件表达式,如果表达式为 true,则循环继续,否则结束循环,条件表达式可以被忽略,忽略条件表达式后默认形成无限循环。
下面代码忽略条件表达式,但是保留结束语句,代码如下:
var i =0;
for (; ; i++) {
    if (i > 10) {
        break;
    }
}
代码说明如下:
  • 第 2 行,无须设置 i 的初始值,因此忽略 for 的初始语句,两个分号之间是条件表达式,也被忽略,此时循环会一直持续下去,for 的结束语句为 i++,每次结束循环前都会调用。
  • 第 3 行,判断 i 大于 10 时,通过 break 语句跳出 for 循环到第 7 行。
上面的代码还可以改写为更美观的写法,代码如下:
var i =0;
for {
    if (i > 10) {
        break;
    }
    i++;
}
代码说明如下:
  • 第 2 行,忽略 for 的所有语句,此时 for 执行无限循环。
  • 第 6 行,将 i++ 从 for 的结束语句放置到函数体的末尾是等效的,这样编写的代码更具有可读性。
无限循环在收发处理中较为常见,但需要无限循环有可控的退出方式来结束循环。
在上面代码的基础上进一步简化代码,将 if 判断整合到 for 中,变为下面的代码:
var i =0;
for (;i <= 10;) {
    i++;
}
在代码第 3 行中,将之前使用if i>10{}判断的表达式进行取反,变为判断 i 小于等于 10 时持续进行循环。

上面这段代码其实类似于其他编程语言中的 while,在 while 后添加一个条件表达式,满足条件表达式时持续循环,否则结束循环。
在结束每次循环前执行的语句,如果循环被 break、return等语句强制退出,结束语句不会被执行。
EasyScript中可以用for来遍历集合数据,类似于java中的for、PHP中的foreach
var arr=["hello","world"];
for(var v:arr)
{
    response.echo(v);
}
运行结果:
helloworld
除对数组进行遍历外,也可以对map数据进行遍历,示例:
var m={
    "blue":0,
    "yellow":1,
    "white":3
};
for(var k,v:m)
{
    response.echo(""+k+"="+v+"\n");
}
运行结果:
blue=0
yellow=1
white=3
注意:对map数据进行遍历时,不保证遍历的顺序!上例中的输出结果也可能是
blue=0
white=3
yellow=1
要保证排序顺序的遍历,可以先将key保存到数组中,对数组进行排序,然后再遍历,示例:
var m={
    "blue":0,
    "yellow":1,
    "white":3
};
var arr=[];
for(var k,v:m)
{
    arr.Add(k);
}
arr.Sort();

for(var k:arr)
{
    response.echo(""+k+"="+m[k]+"\n");
}
运行结果,顺序是确定的:
blue=0
white=3
yellow=1