javascript 这么写有什么意义?

2021-06-27 14:48:00 +08:00
 nowheretoseek

断点分析某问答网站的 js 源码,发现某个函数如下

        var r = function(r) {
            var o = new G;
            return o.k = n,
            o.k[2] = r,
            o.v(e.G, t.h),
            o.r[6]
        };

是 prettify 之后的 code 了,不过原函数应该也是 return 多个值。我理解 return 是不能操作多个值的啊,console 里面试了一下也报错,这里为什么会有这种写法呢?

1567 次点击
所在节点    问与答
11 条回复
mxT52CRuqR6o5
2021-06-27 14:49:43 +08:00
不是什么 return 多个值,就是单纯的逗号表达式,很多语言都有的,而且也不会报错
nowheretoseek
2021-06-27 14:52:37 +08:00
@mxT52CRuqR6o5 也就是 return 的只是最后一个,后面的值吧?可是这么写有什么意义呢?
Cbdy
2021-06-27 14:52:49 +08:00
C 语言祖传的逗号表达式
yuzo555
2021-06-27 14:53:24 +08:00
return 的是最后一个值。

return a,b,c
相当于
a;b;return c
mxT52CRuqR6o5
2021-06-27 14:56:25 +08:00
@nowheretoseek 没什么意义,就是单纯的代码压缩
而且现在为了追求压缩极限,不仅考虑压缩后的文件大小,还会考虑 zip(等 http body 压缩协议)压缩后的大小,使用逗号分割比使用分号分割能提供更好的文本冗余以供压缩
yuzo555
2021-06-27 15:00:21 +08:00
“原函数应该也是”,大概率不是,这种一般是自动优化压缩后的代码。优化器大部分都会这样处理 return 。

至于优化器为什么要这么处理,大概是为了节省体积。在这个例子里面看不出来,但如果有条件语句的话,还是能节约一对花括号的。
nowheretoseek
2021-06-27 15:16:46 +08:00
谢谢各位,搞明白了。
原代码不是这样的机构,return 后出现多个逗号分隔的值是压缩导致的,逗号比分号提供更好的压缩率。
ashong
2021-06-27 19:39:27 +08:00
这是 minified 代码吧
ouxch
2021-06-27 22:12:10 +08:00
@nowheretoseek
哈哈我前不久也在公司 node 项目里看到这样的代码,lint 报了一个警告,我问遍了项目组的人都没人知道这写法啥意思,原来是老大以前写的。
Google 了一下'nodejs return comma',出来的第一个就是这个:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comma_Operator
逗号操作符 对它的每个操作数求值(从左到右),并返回最后一个操作数的值。
跟 return 没啥关系,就是 js 支持的一种写法:逗号分割的表达式从左到右依次求值,并返回最后一个表达式的值。
可以让代码更简洁,不过不推荐这种写法,不然 lint 也不会警告了😄。
nowheretoseek
2021-06-27 22:47:25 +08:00
@ashong 对,chrome 的 source 面板里对 minified 的代码 prettify 后得到的
nowheretoseek
2021-06-27 22:48:17 +08:00
@ouxch 的确不是常用写法,不是常看类似代码的话一开始容易懵

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/786051

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX