用逗号分配工作吗?

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

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

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

示例控制台会话

这里有很多事情要做,但基本上,这要归功于逗号运算符 。

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


此代码:

 aaa = 1,2,3 

相当于:

 aaa = 1; 2; 3; 

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


此代码:

 var bbb = 1,2,3 

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

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

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

 var bbb = 1; var 2; var 3; 

当然, 2是不是一个有效的标识符,所以它在这一点上失败。


此代码:

 var bbb = (1,2,3) 

与第一个非常相似,除了因为数值被括在圆括号中,他们首先被评估。 所以这是等同于:

 1; 2; var bbb = 3; 

逗号在Javascript中有多种用法。 在expression式中:

 a = 1, 2, 3; 

这是一个运营商,只是简单地返回它的右边的论点。 但它也是var声明的一部分,它们是:

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

(这意味着该部分是可选的)。 您的var声明在逗号后缺lessvariables名,所以不会parsing。 你可以得到你想要的效果:

 var a = (1, 2, 3); 

括号将逗号视为操作符而不是variables声明之间的分隔符。

在你的例子中,逗号在两个上下文中使用:

var语句

var语句的语法是:

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

这里用逗号分隔variables名 – 值对。 以下内容不起作用,因为variables名不能以数字开头(请参见标识符名称 ):

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

逗号运算符

逗号运算符评估两个操作数(从左到右)并返回第二个操作数的值。 以下expression式的工作如下:

 aaa = 1, 2, 3; 
  • aaa = 1, 2得到2
    • 请注意, aaa = 1是首先评估的,因为=具有较高的优先级,
  • 2, 3产量3
 var bbb = (1, 2, 3); 
  • 如上所述(1, 2, 3)expression式(1, 2, 3)产生3
  • variablesbbb被赋值为3

在第一种情况下:

aaa = 1,2,3

逗号作为expression分隔符。 它执行aaa分配,然后计算2并丢弃它,然后计算3并丢弃它。

在第二:

 var bbb = 1,2,3 

var关键字告诉Javascript编译器,a之后的下一个应该是另一个variables名。 它没有find,所以它死亡和嘲笑。

 var bbb = (1,2,3) 

在这里,编译器首先评估1并忽略它。 然后评估2并忽略它。 然后评估3 ,这是留在堆栈,所以它被分配到bbb

虽然使用逗号分隔expression式并不常见,但有时在外观方面有用。

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