【发布时间】: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
为什么aaa = 1,2,3 工作并将aaa 的值设置为1?
为什么var bbb = 1,2,3 不起作用?
为什么var bbb = (1,2,3) 工作并将bbb 的值设置为3?
【问题讨论】:
var a1,a2,a3; 只会声明三个局部变量。
标签: javascript syntax
这里发生了很多事情,但基本上都归结为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。
(1 + 2) * 3 时一样,首先计算 1 + 2,然后将该表达式的结果替换回外部表达式以进行其余的计算。
逗号在 Javascript 中有多种用途。在表达式中:
a = 1, 2, 3;
它是一个简单地返回其右手参数的运算符。但它也是var 声明语法的一部分,它们是:
var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;
(其中[...] 表示该部分是可选的)。您的 var 声明缺少逗号后的变量名,因此它不会解析。你可以得到你想要的效果:
var a = (1, 2, 3);
括号强制将逗号视为运算符,而不是变量声明之间的分隔符。
【讨论】:
在您的示例中,逗号用于两种情况:
var statementvar语句的语法是:
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
这里,逗号用于分隔变量名-值对。以下将不起作用,因为变量名称不能以数字开头(请参阅identifier names):
var bbb = 1, 2, 3;
// SyntaxError: Unexpected number
逗号运算符计算其两个操作数(从左到右)并返回第二个操作数的值。以下表达式的工作方式如下:
aaa = 1, 2, 3;
aaa = 1, 2 产生 2
aaa = 1首先被评估,因为=的优先级高于,
2, 3 产生 3var bbb = (1, 2, 3);
(1, 2, 3) 产生3
bbb被赋值3
【讨论】:
aaa = 1, 2, 3 => 逗号运算符用于分隔以下 3 个语句:aaa=1、2 和 3。逗号运算符的结果是最后一条语句 3 的值。但是,aaa 被赋值为 1,从 OP 的屏幕截图中可以清楚地看到。原因是运算符优先级,逗号运算符的优先级最低。
第一种情况:
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);
}
【讨论】: