【问题标题】:Does assignment with a comma work?用逗号赋值有用吗?
【发布时间】:2014-03-31 22:30:28
【问题描述】:

为什么aaa = 1,2,3 工作并将aaa 的值设置为1

为什么var bbb = 1,2,3 不起作用?

为什么var bbb = (1,2,3) 工作并将bbb 的值设置为3

【问题讨论】:

  • 您收到语法错误,因为变量名不允许以数字开头。 var a1,a2,a3; 只会声明三个局部变量。

标签: javascript syntax


【解决方案1】:

这里发生了很多事情,但基本上都归结为comma operator

逗号运算符计算其两个操作数(从左到右)并返回第二个操作数的值。


这段代码:

aaa = 1,2,3

相当于:

aaa = 1;
2;
3;

所以 aaa 被隐式声明并赋值为 1。请注意,控制台上的输出是最后一条语句 3 的结果。


这段代码:

var bbb = 1,2,3

是语法错误,因为变量声明中的逗号用于在一行中声明多个变量。正如 MDN 文章指出的那样,

请注意,var 语句中的逗号不是 逗号运算符,因为它不存在于表达式中。相反,它是var 语句中的一个特殊字符,可以将多个语句合并为一个。

所以这段代码大致相当于:

var bbb = 1;
var 2;
var 3;

当然,2 不是一个有效的标识符,所以它在那个时候失败了。


这段代码:

var bbb = (1,2,3)

与第一个非常相似,除了因为数值被括在括号中,它们首先被评估。所以这大致相当于:

1;
2;
var bbb = 3;

【讨论】:

  • 更重要的是,var bbb = 1; 中的 ==aaa = 1; 中的 = 不同 - 它们来自语法中的不同产生式(Initialiser vs AssignmentExpression),只是碰巧使用相同的令牌。
  • 很好的解释。不完全明确的是a = 1, 2, 3 可以用括号括起来为(a = 1), 2, 3,其计算结果为a = 1; 2; 3(并返回3,例如b = (a = 1, 2, 3) 会将3 分配给b)。相反,a = (1, 2, 3) 的计算结果为 1; 2; a = 3 并返回 3。
  • MDN 对变量赋值中的括号有什么说法,为什么它是相反的?我找不到文档
  • @staticx 没有什么是真正“反向”完成的。首先计算括号。就像您拥有 (1 + 2) * 3 时一样,首先计算 1 + 2,然后将该表达式的结果替换回外部表达式以进行其余的计算。
【解决方案2】:

逗号在 Javascript 中有多种用途。在表达式中:

a = 1, 2, 3;

它是一个简单地返回其右手参数的运算符。但它也是var 声明语法的一部分,它们是:

var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;

(其中[...] 表示该部分是可选的)。您的 var 声明缺少逗号后的变量名,因此它不会解析。你可以得到你想要的效果:

var a = (1, 2, 3);

括号强制将逗号视为运算符,而不是变量声明之间的分隔符。

【讨论】:

    【解决方案3】:

    在您的示例中,逗号用于两种情况:

    var statement

    var语句的语法是:

    var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
    

    这里,逗号用于分隔变量名-值对。以下将不起作用,因为变量名称不能以数字开头(请参阅identifier names):

    var bbb = 1, 2, 3;
    // SyntaxError: Unexpected number
    

    Comma Operator

    逗号运算符计算其两个操作数(从左到右)并返回第二个操作数的值。以下表达式的工作方式如下:

    aaa = 1, 2, 3;
    
    • aaa = 1, 2 产生 2
      • 注意aaa = 1首先被评估,因为=的优先级高于,
    • 2, 3 产生 3
    var bbb = (1, 2, 3);
    
    • 如上所述,表达式(1, 2, 3) 产生3
    • 变量bbb被赋值3

    【讨论】:

    • aaa = 1, 2, 3 => 逗号运算符用于分隔以下 3 个语句:aaa=123。逗号运算符的结果是最后一条语句 3 的值。但是,aaa 被赋值为 1,从 OP 的屏幕截图中可以清楚地看到。原因是运算符优先级,逗号运算符的优先级最低。
    【解决方案4】:

    第一种情况:

    aaa = 1,2,3

    逗号用作表达式分隔符。它对aaa 执行赋值,然后计算2 并丢弃它,然后计算3 并丢弃它。

    第二个:

    var bbb = 1,2,3
    

    var 关键字告诉 Javascript 编译器,, 之后的下一个变量应该是另一个变量名。它没有找到,所以它会死掉并作呕。

    var bbb = (1,2,3)
    

    在这里,编译器首先评估1 并忽略它。然后它评估2 并忽略它。然后它评估3,并将其留在堆栈中,因此它被分配给bbb

    虽然使用逗号分隔表达式并不常见,但它有时在for 看起来很有用。

    for (i = 0, l = 10; i < l; i++) {
      console.log(i);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2021-08-30
      • 2018-03-22
      • 2012-12-30
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多