带有多个逗号分隔值的return语句

Dun*_*ill 78 javascript

可能重复:
Javascript语法:逗号是什么意思?

这种模式会回归什么?它是如何工作的?

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

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

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

T.J*_*der 142

这是逗号运算符.它评估其左侧操作数,抛出结果,评估其右侧操作数,并将其作为结果值.它的左到右的关联,所以a, b, c求值a,然后b,然后c,并采取结果c作为其值.

在您的示例中,它完全像:

myfunc();
myobj.myvar = someobj.prop;
return myobj;
Run Code Online (Sandbox Code Playgroud)

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

因为你已经说过它是一个缩小器:如果这是条件块的一部分,缩小器可能获得的非常小的好处:它可以保存一个或两个字符.如果我们假设长形看起来像这样:

if (someCondition) {
    myfunc();
    myobj.myvar = someobj.prop;
    return myobj;
}
Run Code Online (Sandbox Code Playgroud)

...使用逗号运算符,minifier可以执行此操作(63个字符):

if(someCondition)return myfunc(),myobj.myvar=someobj.prop,myobj
Run Code Online (Sandbox Code Playgroud)

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

if(someCondition){myfunc();myobj.myvar=someobj.prop;return myobj}
Run Code Online (Sandbox Code Playgroud)

...不改变代码的功能,如果后面是一个}或一些其他适当的字符(或文件结束)来触发自动分号插入结束.否则,它将需要;第一个,但仍然保存一个字符.

  • +1(我刚刚学到了新东西) (24认同)
  • @ FunkyFresh84:如果没有能够安全地保存角色,缩小器就不会完成它的工作.;-) (4认同)
  • 更糟糕的是,你可以把所有这一切放在一条线上.使用`,`而不是`;`只允许`return`语句放在前面,它会混淆维护者. (3认同)
  • @vitaly-t - 逗号运算符?不,绝对不仅仅是遗产。事实上,由于简洁的箭头函数,它现在比五年前得到了更多的使用,人们在副作用中硬撑着:`a = map(v => (v.method(), v.prop)) ;`。(我不喜欢那个,但人们这样做。) (2认同)

小智 11

逗号操作符求值(左到右)的表达,然后将其返回最后结果,在这种情况下将是评价myobj标识符.

如果这对你很重要,你可以做到这一点消除一些花括号......

if (true)
    ;// do something
else
    return myfunc(), myobj.myvar = someobj.prop, myobj
Run Code Online (Sandbox Code Playgroud)

......而不是......

if (true)
    ;// do something
else {
    myfunc();
    myobj.myvar = someobj.prop;
    return  myobj;
}
Run Code Online (Sandbox Code Playgroud)