为什么这段代码有效?

时间:2011-08-21 17:27:12

标签: javascript

我认为如果语句不应该包含赋值运算符而是包含比较运算符(==,===),但这非常有效。为什么呢?

var foo = true,
    bar = true;
if (foo = true) {
    console.log('foo is true');
}

我被告知这不行,但我发现它确实有效。

4 个答案:

答案 0 :(得分:6)

你实际上在做什么,仍然在比较:

if ((foo = true) == true) ...

这是“缩写”:

foo = true;
if (foo == true) ...

所以它确实有意义=)!

答案 1 :(得分:5)

从ES5.1规范(12.5)

IfStatement :
    if ( Expression ) Statement  else Statement
    if ( Expression ) Statement

任何有效的表达式都可以放在if。

foo = true是一个表达式,它的计算结果为真。

为避免将来编写=而不是==等错误,请将其写为

if (true = foo) {

}

由于您无法将值分配给true

等文字值,因此会抛出分配错误

答案 2 :(得分:3)

赋值被评估为true,因为JavaScript返回它将变量设置为的值。

var foo = true,
    bar = true;
if (foo = true) {
    console.log('foo is true');
}

变为:

var foo = true,
    bar = true;
if (true) {
    console.log('foo is true');
}

传递if。请注意,设置为false不起作用,因为条件将评估为false,但未通过if

关于if

的规范
  

if(Expression)Statement

您正在使用作业表达式:

  

AssignmentExpression:   ConditionalExpression LeftHandSideExpression AssignmentOperator AssignmentExpression

=指定为:

  

简单分配(=)

     

生产AssignmentExpression:LeftHandSideExpression = AssignmentExpression评估如下:

     

...

     

2。设rref是评估AssignmentExpression的结果。

     

3。设rval为GetValue(rref)。

     

...

     

<强> 6。返回rval。

答案 3 :(得分:1)

可悲的是,你实际上是将foo指定为true。 :)