JavaScript中的逗号运算符:应为语法错误,但代码运行正常
Comma operator in JavaScript: syntax error expected, but code runs OK
我刚刚修复了我的一个微不足道的web应用程序中的一些错误,并偶然发现了一些有趣的行。我不记得我为什么要按照原来的方式执行这些线路。现在我把它们改成了"普通"语法,一切都很好。我的问题只是出于好奇:为什么这个方法有效?我预计会出现语法错误,但事实并非如此。代码确实有效。
这是旧方法的实现:
ListFillFilter: function(list){
if (OC.Shorty.Debug) OC.Shorty.Debug.log("using 'default' method to filter filled list");
// only makes sense for default OC.Shorty list
var data=new Array();
data['sum_shortys']=$('#desktop #list-of-shortys tbody tr').length;
data['sum_clicks']=0;
$('#desktop #list-of-shortys tbody tr').each(function(){
data['sum_clicks']+=parseInt($(this).attr('data-clicks'),10);
});
OC.Shorty.WUI.Sums.fill.apply(OC.Shorty.Runtime.Context.ListOfShortys,[data]),
// filter list
OC.Shorty.WUI.List.filter.apply(this,[list,'target',list.find('thead tr#toolbar th#target #filter').val()]),
OC.Shorty.WUI.List.filter.apply(this,[list,'title', list.find('thead tr#toolbar th#title #filter').val()]),
OC.Shorty.WUI.List.filter.apply(this,[list,'status',list.find('thead tr#toolbar th#status select :selected').val()])
// sort list
$.when(
OC.Shorty.Action.Preference.get('list-sort-code')
).done(function(pref){
OC.Shorty.WUI.List.sort(list,pref['list-sort-code']);
})
}, // OC.Shorty.Runtime.Context.ListOfShortys.ListAddInsert
在中间,您可以看到5行都以"OC.Shorty.WUI.Sums.fill.apply"开头。这些行以逗号(",")而不是分号(";")结尾。为什么没有显示为语法错误?
基本上,逗号运算符将多个表达式分组在一起,它们表示最后一个表达式的值。在你的情况下,你也可以省略它
想象一下你有这样的代码:
1
2
3
这是非常有效的JavaScript代码。这些数字只是用来表示三个任意的表达式。
如果您要执行以下操作:
var expression_value = 1
2
3
CCD_ 1将具有值CCD_。
如果使用逗号运算符和括号:
expression_value = (1,
2,
3)
它将具有值3
,因为逗号运算符返回最右边表达式的值。
如果不使用任何括号,则以下括号将是隐含:
implied = ((expression_value = 1),
2,
3)
expression_value
将具有值1
,但implied
(即整个表达式)现在将具有值3。
逗号运算符标记序列;JS插入额外的";"s仅在行末尾(如果这是使代码可解析所必需的)。因此,像这样的代码
alert("hi"),
alert("there"),
alert("bob") // no semi-colon here
是完全有效的-它被理解为
alert("hi"),
alert("there"),
alert("bob"); // notice the semi-colon
而不是(非法的)
alert("hi"),;
alert("there"),;
alert("bob");
不过,依赖分号的自动插入被认为是不好的风格。
此语法使用逗号运算符,
。它计算所有操作数,并返回最后一个操作数的值。
使用这种编码风格的原因是为了快速或在一行中执行代码。这里有一个例子:
var a = 0,
b = 1,
c;
c = ( a++, b++, a + 2 ); // a is incremented, b is incremented, then c is assigned a + 2
a; // 1
b; // 2
c; // 3
相关文章:
- 咕噜声.js无法读取文件(错误代码:EISDIR)
- 科尔多瓦指南针 API 给出错误代码 3
- 如何在使用JavascriptCallbackBehavior时引发带有HTTP错误代码的WebFaultExcepti
- 解析错误代码 121
- Ajax get jsonp给出错误代码500“;请求被阻止”;来自MVC应用程序
- ionic http获取到本地文件会给出http错误代码0
- Imacros/jQuery TypeError:无法访问死对象,第 816 行(错误代码:-991)
- 电话差距/网络数据库错误代码说明
- NaN 错误代码有什么问题
- 异常:“远程主机关闭了连接.错误代码为 0x80070057”
- 咕噜声/巴别塔错误:无法写入“dist”文件(错误代码:EISDIR)
- 科尔多瓦的文件传输写入错误(代码 1)
- 角度$asyncValidators将错误代码传输到模板
- 接收错误代码 3,http_status空,正文空,异常状态 2
- 运行 grunt.file.copy 返回错误代码:ENOENT
- Parse.com 找不到错误代码:141 函数
- 尝试运行作业时分析错误代码 1 内部错误
- 节点 js 退出状态 8,错误代码 0 在 Mac 上运行
- 如何使用mootools确定损坏图像上的错误代码
- HTML 错误代码 206