这几天在看一些javascript的源码,但是发现了一些我看不懂的语法。
1)for-in 循环
var c;
var obj={name:'test',age:33};
for(var e in c={},obj){
console.info(e+' = '+obj[e]);
}
2)条件运算符 (?:)
通常,我们以这种方式使用此运算符:
x > 0 ? x*y : -x*y
但是我见过一些这样的代码:
x > 0 ? (x*y,z=bar,..other expressoin) : (-x*y)
但是如果我把逗号改成冒号就不行了,会报错。
最佳答案
在这两种情况下,comma operator [MDN]使用:
You can use the comma operator when you want to include multiple expressions in a location that requires a single expression. The most common usage of this operator is to supply multiple parameters in a
for
loop.
还有 specification :
11.14 Comma Operator ( , )
Syntax
Expression : AssignmentExpression Expression , AssignmentExpression
(...)
Semantics
The production Expression : Expression , AssignmentExpression is evaluated as follows:
- Let lref be the result of evaluating Expression.
- Call GetValue(lref).
- Let rref be the result of evaluating AssignmentExpression.
- Return GetValue(rref).
这只是意味着返回最后一个表达式的结果作为整个表达式“列表”的结果。
在您提供的示例中,它用于其 side effects [Wikipedia] ,即计算每个表达式。
总的来说,我会说这不是很好的风格,而且正如您所注意到的,更难理解。
for(var e in c={},obj)
与
相同c = {};
for(var e in obj)
an 似乎没有增加任何值(value)。更好的做法是在第一行中初始化 c
:var c = {};
。
在条件运算符的情况下:如果 x > 0
为 true
,则计算所有表达式并返回最后一个表达式的结果。在这种情况下,使用普通的 if
语句会更好(更容易理解)。
再次强调,逗号运算符甚至条件运算符的使用似乎完全是因为它们的副作用:通常情况下,条件运算符应该只返回一个值而不是执行任意表达式(返回的单个函数调用一个值可能是一个异常(exception))。
正如 MDN 文档所说,它更常用于 for
循环中以初始化多个变量:
for(var i = 0, l = array.length; i < l; i++)
关于javascript - 两个javascript语法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438967/