IF语句作为JavaScript中的赋值表达式

时间:2014-12-16 17:20:01

标签: javascript

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。

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>