javascript - 两个javascript语法问题

标签 javascript

这几天在看一些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:

  1. Let lref be the result of evaluating Expression.
  2. Call GetValue(lref).
  3. Let rref be the result of evaluating AssignmentExpression.
  4. Return GetValue(rref).

这只是意味着返回最后一个表达式的结果作为整个表达式“列表”的结果。

在您提供的示例中,它用于其 side effects [Wikipedia] ,即计算每个表达式。
总的来说,我会说这不是很好的风格,而且正如您所注意到的,更难理解

for(var e in c={},obj)

相同
c = {};
for(var e in obj)

an 似乎没有增加任何值(value)。更好的做法是在第一行中初始化 c:var c = {};

在条件运算符的情况下:如果 x > 0true,则计算所有表达式并返回最后一个表达式的结果。在这种情况下,使用普通的 if 语句会更好(更容易理解)。

再次强调,逗号运算符甚至条件运算符的使用似乎完全是因为它们的副作用:通常情况下,条件运算符应该只返回一个值而不是执行任意表达式(返回的单个函数调用一个值可能是一个异常(exception))。


正如 MDN 文档所说,它更常用于 for 循环中以初始化多个变量:

for(var i = 0, l = array.length; i < l; i++)

关于javascript - 两个javascript语法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438967/

相关文章:

可以处理带注释的新闻标题的 Javascript 图表组件

javascript - 如何使用 javascript 在 Indesign CS6 中查找文本框架? (我可以通过包含特定段落样式或什么的文本框架进行查询?)

javascript - 如何在 Dygraphs 中缩放点?

javascript - Handlebars 在 HTML 属性中设置值以供 JS 使用

javascript - 在 Mustache JS 中包含一个部分

javascript - 使用 javascript 更改单选按钮旁边的文本?

javascript - 使用集合过滤事件

javascript - xmldoc.selectNodes() 无法正常工作

javascript - 如何使用 anchor 标记将表单值传递给操作?

javascript - Facebook 无需请求身份验证即可获取用户名