断点分析某问答网站的 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 里面试了一下也报错,这里为什么会有这种写法呢?
1
mxT52CRuqR6o5 2021-06-27 14:49:43 +08:00 via Android
不是什么 return 多个值,就是单纯的逗号表达式,很多语言都有的,而且也不会报错
|
2
nowheretoseek OP @mxT52CRuqR6o5 也就是 return 的只是最后一个,后面的值吧?可是这么写有什么意义呢?
|
3
Cbdy 2021-06-27 14:52:49 +08:00 via Android
C 语言祖传的逗号表达式
|
4
yuzo555 2021-06-27 14:53:24 +08:00
return 的是最后一个值。
return a,b,c 相当于 a;b;return c |
5
mxT52CRuqR6o5 2021-06-27 14:56:25 +08:00 via Android 3
@nowheretoseek 没什么意义,就是单纯的代码压缩
而且现在为了追求压缩极限,不仅考虑压缩后的文件大小,还会考虑 zip(等 http body 压缩协议)压缩后的大小,使用逗号分割比使用分号分割能提供更好的文本冗余以供压缩 |
6
yuzo555 2021-06-27 15:00:21 +08:00 1
“原函数应该也是”,大概率不是,这种一般是自动优化压缩后的代码。优化器大部分都会这样处理 return 。
至于优化器为什么要这么处理,大概是为了节省体积。在这个例子里面看不出来,但如果有条件语句的话,还是能节约一对花括号的。 |
7
nowheretoseek OP 谢谢各位,搞明白了。
原代码不是这样的机构,return 后出现多个逗号分隔的值是压缩导致的,逗号比分号提供更好的压缩率。 |
8
ashong 2021-06-27 19:39:27 +08:00 via iPhone
这是 minified 代码吧
|
9
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 也不会警告了😄。 |
10
nowheretoseek OP @ashong 对,chrome 的 source 面板里对 minified 的代码 prettify 后得到的
|
11
nowheretoseek OP @ouxch 的确不是常用写法,不是常看类似代码的话一开始容易懵
|