JSLint错误说明文档(https://jslinterrors.com/unexpected-assignment-expression)表示如果我们评估赋值表达式(x = 0),则IF主体将永远不会被执行(y = 1)。
var x, y;
if (x = 0) {
y = 1;
}
“if语句的主体不会被执行,因为 赋值表达式导致undefined,这是假的。“
但我可以在if (x = 1) { y = 1; }
证明相反的情况。这是JS版本的问题吗?
更新
实际上我假设可以将赋值的结果用作测试值,我犯了一个错误。我真正可以在控制台中证明的是赋值返回一个值,如x = 1输出1。
答案 0 :(得分:3)
该文章摘录正确和不正确。 if
的正文不会与if (x = 0)
一起输入是正确的,但是当它说出原因时它是不正确的。
突出显示错误的部分:
上述示例不会检查变量
x
是否具有值0
,而是将值0
指定给x
。 if语句的主体不会被执行,因为赋值表达式导致undefined
,这是伪造的(原文如此)。
这是完全错误的。赋值表达式的结果是已分配的值,而不是undefined
,因此if (x = 0)
不会进入if
的正文(因为0
是假的),但是if (x = 1)
会(因为1
是真的)。
这是JS版本的问题吗?
不,一直都是这样。有人在这些文档中弄错了。
事实上,我假设可以将赋值的结果用作测试值,我犯了一个错误。
这不是一个错误,你可以 - 有时候,你想要。这很常见,例如:
while ((thing = getMeTheNextThing()) != null) {
// ...do something with `thing`
}
这也是将作业的结果用作测试。有时人们甚至会这样写:
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 provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>