在看《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++) {
代码块
}
其实就是把判断和赋值放到一起了,一边循环一边赋值。焕然大悟!