【问题标题】:return statement with multiple comma separated values [duplicate]具有多个逗号分隔值的返回语句[重复]
【发布时间】:2012-05-04 07:12:21
【问题描述】:

可能重复:
Javascript syntax: what comma means?

这个模式返回什么?它是如何工作的?

return myfunc(), myobj.myvar = someobj.prop, myobj

我之前没有遇到过这种模式,但我一直在查看 Bing Maps Ajax 控件并多次注意到这种模式。

据我了解,不会返回多个值。那么这个模式有什么作用呢?返回什么?这种模式有什么好处?

【问题讨论】:

  • 它是否返回一组参数;喜欢如何在函数调用中重载参数?
  • “这种模式有什么好处?” ——它没有。这是令人困惑的非惯用代码。
  • 我看不出任何原因......它甚至在堆栈上放置的对象比有三个普通指令时更多......
  • 这个问题及其答案对我来说非常有价值,即这个问题不应该被标记为重复。所谓的“原始”问题解决了逗号的一般用法,但这里的这个问题更具体。我来这里是为了深入了解使用装饰器时从 Typescript Playground 发出的转译代码,这个问题及其答案对我帮助很大。我的谷歌搜索可能不会把我引向“原始”问题,即使这样我也会不满意。所以,感谢提问者和响应者。

标签: javascript


【解决方案1】:

这是comma operator。它评估其左侧操作数,将结果丢弃,评估其右侧操作数,并将其作为其结果值。它是从左到右关联的,所以a, b, c 评估a,然后是b,然后是c,并将c 的结果作为其值。

在你的例子中,它就像:

myfunc();
myobj.myvar = someobj.prop;
return myobj;

有些人真的更喜欢在一条线上做事,即使没有客观理由。您给出的示例没有任何好处,实际上它令人困惑,因为它看起来像前两位与最终将返回的值相关,而他们没有。 (我写在你告诉我们它是缩小代码之前;显然,人类不清楚只是源代码中的问题,而不是缩小代码。)

既然你说它是一个缩小器:如果它是条件块的一部分,那么缩小器可能获得的非常小的可能的好处是:它可以保存一个或两个字符。如果我们假设长格式如下所示:

if (someCondition) {
    myfunc();
    myobj.myvar = someobj.prop;
    return myobj;
}

...使用逗号运算符,缩小器可以做到这一点(63 个字符):

if(someCondition)return myfunc(),myobj.myvar=someobj.prop,myobj

...而不是这个(65 个字符):

if(someCondition){myfunc();myobj.myvar=someobj.prop;return myobj}

...在不改变代码功能的情况下,如果接下来是} 或其他适当的字符(或文件结尾)以在末尾触发automatic semicolon insertion .否则,第一个字符需要;,但这仍然可以节省一个字符。

【讨论】:

  • +1(我刚刚学到了一个新东西)
  • 更糟糕的是,您可以将所有内容放在一行中。使用, 而不是; 只会让return 语句出现在前面,这会使维护者感到困惑。
  • 这实际上是我所怀疑的,但如果前两个语句不被返回,它们不会出现在 return 语句之前,这似乎很奇怪。代码被缩小了,不知道是不是有什么优化和缩小的事情呢?我真的不明白这会有什么不同。
  • @FunkyFresh84:如果缩小器没有在可以安全地保存角色的地方保存角色,它就不会完成它的工作。 ;-)
  • @vitaly-t - 逗号运算符?不,绝对不仅仅是遗产。事实上,由于简洁的箭头函数,它现在比五年前得到了更多的使用,人们在其中鞋拔子的副作用:a = map(v => (v.method(), v.prop));。 (我不喜欢这样,但人们会这样做。)
【解决方案2】:

comma operator 评估(从左到右)表达式,然后返回最后一个结果,在这种情况下将是 myobj 标识符的评估。

如果这对你很重要,你可以去掉一些花括号...

if (true)
    ;// do something
else
    return myfunc(), myobj.myvar = someobj.prop, myobj

...而不是...

if (true)
    ;// do something
else {
    myfunc();
    myobj.myvar = someobj.prop;
    return  myobj;
}

【讨论】:

    【解决方案3】:

    在您的示例中,myobj 应该在执行之前的所有内容时返回

    myfunc();
    myobj.myvar = someobj.prop;
    return myobj;
    

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多