从本质上说,我想申报while循环的条件部分的变量在javascript:声明中,而条件变量在JavaScript
while (var b=a.pop()) {
do_sth(b)
}
然而,我的浏览器(Firefox)不接受。相反,我必须这样走:
var b
while (b=a.pop()) {
do_sth(b)
}
哪些工作。预期这种行为?
从本质上说,我想申报while循环的条件部分的变量在javascript:声明中,而条件变量在JavaScript
while (var b=a.pop()) {
do_sth(b)
}
然而,我的浏览器(Firefox)不接受。相反,我必须这样走:
var b
while (b=a.pop()) {
do_sth(b)
}
哪些工作。预期这种行为?
是的。
如果你愿意,你可以使用一个for
循环,就像这样:
for (var b; b = a.pop();) { //Note the final semicolon
do_sth(b);
}
JavaScript没有块范围。所以所有var
声明都在函数范围内。所以在while
表达式中声明一个变量在JavaScript中没有意义。
此外,你应该用分号结束你的语句。这不是绝对必要的,但强烈建议。
这个问题有点过时了,但我认为答案都会错过一个重要的区别。也就是说,while
循环期望表达式,其被蒸发为条件的,即可以被转换为布尔值的布尔值或值。详情请参阅Mozilla docs。
纯赋值(无实例化)通过其默认返回值(右侧的值)强制为布尔值。
一个var
(或let
或const
)是声明,允许一个可选的分配,但有undefined
返回值。单独
var foo = 42; // undefined
bar = 42 // 42
返回值不回答这个问题,因为undefined
是falsey,但也表明,即使JS让你把一个var
在:
您可以在控制台轻松地测试此有条件的,它总是会评估为false。
其他人提到了for
语句,并且它们允许声明和实例化变量。这是真的,但for
期待一个声明或assigment documentation explains。
意见可能会有所不同,但对于我来说,所有这些都增加了一个可理解的一致性,而不是循环中行为的怪癖。A while
循环更好地被认为是if
语句的循环版本,而不是类似于for
循环。如果在所有这些方面都有些怪异的话,那么它就是语言与语言正常语法的完全不同。
我在找'为什么?' JavaScript不允许const,let,var,而条件和这回答了我的问题。我总是发现令人困惑的是,当我创建一个新变量而不是变量的值时,控制台报告未定义。 我仍然没有看到JavaScript的点返回undefined;他们也可以返回变量的值,但是如果它返回undefined,更好的浏览器和编译器在条件中使用时会出错。 – 2017-07-29 21:30:34
下面的2解释了变量声明的提升,但并没有解释为什么你不能在'while'条件中声明一个变量(但你可以,例如,在'for'条件下)。你有没有找到一个很好的解释呢? – Barney 2014-03-04 11:03:45
另一个JS怪癖,这就是为什么。 – 2014-12-17 10:13:50