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

IT技术 javascript
2021-03-15 18:56:09

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

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

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

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

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

3个回答

它是逗号运算符它评估其左侧操作数,将结果丢弃,评估其右侧操作数,并将其作为结果值。它是从左到右关联的,因此a, b, c计算a、 then b、 thenc并将 的结果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}

...在不改变代码功能的情况下,如果后面是一个}或其他适当的字符(或文件结尾)以在末尾触发自动分号插入否则,它将需要;第一个,但这仍会保存一个字符。

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

逗号操作符求值(从左至右)的表达式,然后将其返回最后结果,在这种情况下将是评价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;
}

在你的例子中 myobj 应该被返回,因为在执行之前的每件事

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