for循环的特殊写法

在看《js设计模式与开发实践》一书时,遇到了如下的语句:

for (var i = 0, type;type = ['String', 'Array', 'Number'][i++]) {
    代码块
}

当时觉得很疑惑,因为for循环的基本语法是:

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

语句1:在循环(代码块)开始前执行
语句2:定义运行循环(代码块)的条件
语句3:在循环(代码块)已被执行之后执行
如果我们用for循环要输出1到10,我们可以这么写:

for(var i=0;i<10;i++) {
    console.log(i);
}

但是!也可以写成这样

for(var i=10;i--;) {
    console.log(i);
}

为什么呢?怎么能这么写?语句2放的是循环条件,i--是什么判断条件。其实不然,在语句2中,如果返回true循环会继续执行。在js中0, null, undefined, false, ‘’, “”作为条件判断时,其结果为false,也就说当i--到0的时候就是false,循环就终止了。

现在再回头看开头提出的代码:

for (var i = 0, type;type = ['String', 'Array', 'Number'][i++]) {
    代码块
}

这个type = ['String', 'Array', 'Number'][i++]就是判断条件,当成为undefined时就会终止循环了。所以这段代码换成普通写法其实是这样的:

var type = ['String', 'Array', 'Number'];
for(var i = 0;i < type.length;i++) {
    代码块
}

其实就是把判断和赋值放到一起了,一边循环一边赋值。焕然大悟!

你可能感兴趣的:(JavaScript)