那篇文章的摘录有些正确,但也有些是错误的。当使用 if (x = 0) 时,代码块不会被执行,这一点是正确的,但文章解释为什么会这样却是错误的。
错误的部分在这里:
代替检查变量 x 是否等于 0,上面的例子将会把值 0 赋给 x。if 语句体将不会被执行,因为赋值表达式结果为 undefined,而 undefined 是 falsy。
这完全是错误的。一个赋值表达式的结果是被赋的值本身,而不是 undefined,所以 if (x = 0) 不会进入 if 语句体(因为 0 是 falsy),但 if (x = 1) 会进入(因为 1 是 truthy)。
这与 JS 版本无关,这种情况一直存在。只是有些文档中出现了错误。
实际上,我们可以使用赋值表达式的结果作为测试值。有些情况下你需要这么做,这是相当常见的。
while ((thing = getMeTheNextThing()) != null) {
}
这也是使用分配结果作为测试的方式。有时人们甚至会像这样编写代码:
while (thing = getMeTheNextThing()) {
// ...do something with `thing`
}
尽管我从来没有这么做过,因为很容易将其看作 ==
并搞砸了一些东西。
请注意,在 if
语句中想要对变量进行赋值是非常非常罕见的情况。虽然确实会发生,但这种情况非常少,大多数风格指南都建议您拆分赋值和分支。
几乎总是当你看到 if (x = 0)
时,作者想写的是 if (x == 0)
或者 if (x === 0)
。也就是说,他们想要测试x
的值,而不是给x
赋一个新值。
JSLint 文档关于赋值为零的示例:
var x;
snippet.log("first test: using 0");
if (x = 0) {
snippet.log("entered if body");
} else {
snippet.log("entered else body");
}
snippet.log("second test: using 1");
if (x = 1) {
snippet.log("entered if body");
} else {
snippet.log("entered else body");
}
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>