https://jeffmo.github.io/es-trailing-function-commas 目前是一个 stage 3 的提案,Chakra 和 JSC 已经实现了,它允许我们在函数定义时的最后一个形参和函数调用时的最后一个实参的尾部加上逗号。

最后一个参数加上逗号有什么优点?

注意:最后一个参数加逗号的优点只在参数分行写时才能体现出来。

优点1:修改代码时不容易出错

假如当前的代码长这样:

function foo(param1,param2,param3
)

而你此时要做的是删除 param3 参数的实现,这时你很有可能把光标定位到 param3 那一行,连续按下 Command+X 和 Command+S 了事(Sublime):

function foo(param1,param2,
)

一测试,SyntaxError!恍然大悟,回去再把逗号删掉。

假如是新增一个参数呢,问题也类似,你得留心给上一个参数补上逗号;调整参数的顺序(Sublime 用 Ctrl + Command + ↑↓)也类似。除了形参,函数调用时传入的实参也一个道理。

如果每个参数尾部都已经加上了逗号,那么就不存在上面说的这些问题了。

优点2:对 git/hg blame 更友好

我专门用 git 生成了一个演示用的仓库,里面有一个演示文件 test.js:

我现在想知道 param3 和对应的 arg3 是谁在哪个 commit 里加上去,所以我会执行 git blame test.js:

git blame 告诉我,是小李在 11e537fc 这次 commit 里加的。但当你查看那个 commit 的变更时,就会发现,错了,小李只是在实现 param4 时迫于无奈给 param3 补了个逗号,完整的 git log -p test.js 才能看到真相,真正实现 param3 的是小张,而且同时也能发现,小张在实现 param3 的时候也被迫改动了 param2 那一行:

如果每一行参数尾部都有逗号,那么开发人员就不需要修改和本次 commit 无关的行,从而就不会污染 git/hg blame。

参数分行写有什么优点?

有些同学就问了:“这提案对我没用啊,我所有的参数都是写在一行里的”。的确,如果你从不把参数分行写,那你压根用不上这个特性。不过,参数分行写的确是有用的:

优点1:能避免行过长

如果参数太多,或者某个实参是个长字符串,那么参数写在一行就会让编辑器出现横向滚动条,既不美观,也不好读。

优点2:对 git/hg blame 更友好

就像前面演示的,如果你所有的参数都写在一行里,你就无法 blame 到每个参数被添加的 commit。有些同学怀疑了?真的有人这么写吗?是真的,我电脑上刚好有个 V8 的仓库,我们用下面的 grep 命令查找一下:

grep -zoPR --include='*.js' 'function \w+\(\n([\s\w]+,(.+)?\n)+[\s\w]+\)'

果然找到了一个:

git blame 一下呢:

每个参数的 commit 都能方便的拿到!这在多人合作的开源项目里很重要。

优点3:避免分支冲突

显而易见,两个分支同时在一行上添加新的参数,必然会产生冲突。

优点4:方便加注释

如果你需要为每个参数添加注释,除了分行写还有什么选择吗?同样在 V8 的仓库里 grep 到了真实案例,是给每个实参加了注释:

上面说的这些对对象字面量和数组字面量也同样适用吧?

对,上面说的加逗号的优点和分行的优点对 {} 和 [] 同样适用,{} 是在 ES5 里支持尾部加逗号的,[] 从诞生时就支持,因为它需要支持稀疏数组,比如 [1,,,]。

JSON 呢?

“什么时候 json 规范能改,不统一掉很难受啊?” 是啊,我也想,但我也不知道什么时候能改。

能进 ES 几?

ES8(2017)还是 ES9(2018)?不要再 care 了,现在是先有实现后进规范,就像 Chrome 的版本号一样,随它涨去吧。目前 Spidermonkey 和 V8 还没开始实现,我已经给 V8 提了需求 https://bugs.chromium.org/p/v8/issues/detail?id=5051

几个语法限制

下面这些都是 SyntaxError:

function foo(,){} // 没参数只有个逗号
function foo(param1,,){} // 连续的两个逗号
function foo(param1,...rest,){} // 剩余参数后面还有逗号,因为剩余参数必须是最后一个参数

esnext:最后一个参数后面也允许加逗号了相关推荐

  1. Python:为什么只有一个元素的tuple要加逗号?

    如果要定义一个空的tuple,可以写成(): >>> t = () >>> t () 但是,要定义一个只有1个元素的tuple,如果你这么定义: ''' 遇到问题没 ...

  2. SDWebImage使用——一个可管理远程图片加载的类库

    SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下 ...

  3. js java cookie_JS 打开一个模式窗口,使用Cookie传递一个参数

    页面A,加载后打开一个模式窗口,设置一个参数,然后自己关闭 function fullScreen(){ loadpopup(); var width = screen.width-10; var h ...

  4. 不错的递归题:输入123,返回“321”。 要求必须用递归,不能用全局变量,输入必须是一个参数,必须返回字符串。

    题目:输入123,返回"321". 要求必须用递归,不能用全局变量,输入必须是一个参数,必须返回字符串. 解析:每次求得最后一个数字然后加递归剩余的数字(每次缩短一个长度).注意退 ...

  5. 仅需一个参数就可搞定OneProxy的VIP机制

    文章转自:http://card.weibo.com/article/h5/s#cid=1001603863326047255626&vid=&extparam=&from=& ...

  6. 解决父类加载iframe,src参数过大导致加载失败

    原文:解决父类加载iframe,src参数过大导致加载失败 <iframe src="*******.do?param=****" id="leftFrame&qu ...

  7. python ray定时_使用 Ray 用 15 行 Python 代码实现一个参数服务器

    使用 Ray 用 15 行 Python 代码实现一个参数服务器 参数服务器是很多机器学习应用的核心部分.其核心作用是存放机器学习模型的参数(如,神经网络的权重)和提供服务将参数传给客户端(客户端通常 ...

  8. #define 后只有一个参数

    #define AOMDV_PACKET_SALVAGING #define AOMDV_MAX_SALVAGE_COUNT 10 #define AOMDV_EXPANDING_RING_SEARC ...

  9. C语言sum函数不接受一个参数,函数不接受2个参数怎么解决

    c++函数不接受两个参数是为什么 class Time { int hour,minute,second; public: Time(int a=0,int b=0,i需要在使用之前声明一下函数,你在 ...

最新文章

  1. vue element-ui Notification 挤在一起,重叠问题 解决办法
  2. Centos 6.5 初始安装无网卡驱动解决方法
  3. 惠普刀片服务器c7000硬件配置手册_刀片服务器四点不足之处你都知道几个?
  4. 倒立摆自动起摆_今天起,中山街坊可以去唱K、游泳、看电影、摆喜酒了!
  5. 用vue语法写html,Vue -- 模板语法
  6. Eclipse的快捷键大全
  7. 第十二章: 部署Django
  8. 845. 数组中的最长山脉
  9. 主节点数量_你知道电气主接线常见接线方式吗?建议收藏共同学习
  10. Android 如何才能捕获系统的恢复出厂设置事件
  11. Unity3D asset bundle 格式简析
  12. 社招的我,在酷家乐的野蛮生长
  13. Assuming drive cache: write through ubuntu硬盘内存扩展
  14. 紧凑型游戏机械键盘——极度未知HyperX起源60水轴游戏机械键盘
  15. ByVal和ByRef有什么区别
  16. 练习:三子棋(python 列表list“全局变量”特性、插值字符串格式化、set 元素不重复特性)
  17. 常用外贸群发邮件模板,海外邮件
  18. python支持复数以及相关的运算吗_python复数运算
  19. 最简单的线性回归模型 李烨_模型
  20. 计算机控制系统w域,西南交大18秋《计算机控制系统》离线作业

热门文章

  1. 大凉山的美术课,怎么就跟英特尔扯上关系了
  2. 过半网友支持马斯克卖掉特斯拉10%股票,马斯克:会遵守投票结果
  3. AI大神李沐B站走红!连博导们都在追更,还亲自带你逐段读懂论文,网友:带B站研究生吧...
  4. 别笑,日本疫苗的温控方案真是这个
  5. Nature出炉「中国博士生图鉴」:过半学生想换领域换导师,40%学生受抑郁、焦虑困扰...
  6. 波士顿动力双足机器人Atlas放出逆天体操表演,网友:比我还强
  7. 知识库的构建 5-3 马尔科夫逻辑 Markov logic
  8. Caused by: org.apache.ibatis.reflection.ReflectionException我碰到的情况,原因不唯一
  9. -bash: make: command not found的解决办法
  10. 纯 CSS 实现波浪效果!