本质上,我试图在javascript中的while循环的条件部分声明一个变量:
while (var b=a.pop()) {
do_sth(b)
}
然而,我的浏览器(firefox)不接受这一点。相反,我必须这样:
var b
while (b=a.pop()) {
do_sth(b)
}
哪个有效。预期会出现这种情况吗?
答案 0 :(得分:30)
是的,是的。
如果您愿意,可以使用for
循环,如下所示:
for (var b; b = a.pop(); ) { //Note the final semicolon
do_sth(b);
}
答案 1 :(得分:23)
这个问题有点陈旧,但我认为答案都错过了一个重要的区别。也就是说,while
循环需要一个表达式,它可以转换为条件,即布尔值或可以转换为布尔值的值。有关详细信息,请参阅Mozilla docs。
纯赋值(没有实例化)通过其默认返回值(右侧的值)强制转换为布尔值。
var
(或let
或const
)是语句,它允许可选的分配,但返回值为undefined
。
您可以在控制台中轻松测试:
var foo = 42; // undefined
bar = 42 // 42
单独的返回值不会回答这个问题,因为undefined
是假的,但确实表明即使JS允许你在条件中放置var
,它也只是总是评估为假的。
其他人提到了for
语句,它们允许变量的声明和实例化。这是事实,但for
while
期望声明或分配。
意见可能会有所不同,但对我而言,所有这些都会增加可理解的一致性,而不是循环行为的怪癖。 if
循环最好被认为是for
语句的循环版本,而不是for
循环。如果所有这些都有奇怪之处,那就是$text[10] = 'Doe';
语句与语言的正常语法的分歧。
答案 2 :(得分:17)
JavaScript没有块范围。它有功能范围。因此,为了确保人类和JavaScript都以相同的方式读取代码,您应该手动将var声明提升到函数顶部。
以下是JSLint对您的代码的说法:
Problem at line 1 character 8: Expected an identifier and instead saw 'var'.
至少在学习JavaScript时使用JSLint。你会很快学到很多东西。这会伤害你的感情。
答案 3 :(得分:6)
JavaScript没有块范围。因此所有var
声明都在函数范围内。因此,在while
表达式中声明变量在JavaScript中没有意义。
此外,您应该以分号结束语句。这不是绝对必要的,但强烈建议。