前置逗号之争!

前置逗号之争!

个人认为Airbnb的javascript代码规范是写的比较好的, 不过其中有一章关于逗号Commas的使用是这样写的:

前置逗号(Leading commas):不要使用


  1. // bad
  2. var once
  3.   , upon
  4.   , aTime;
  5.  
  6. // good
  7. var once,
  8.     upon,
  9.     aTime;
  10.  
  11. // bad
  12. var hero = {
  13.     firstName: 'Bob'
  14.   , lastName: 'Parr'
  15.   , heroName: 'Mr. Incredible'
  16.   , superPower: 'strength'
  17. };
  18.  
  19. // good
  20. var hero = {
  21.   firstName: 'Bob',
  22.   lastName: 'Parr',
  23.   heroName: 'Mr. Incredible',
  24.   superPower: 'strength'
  25. };

其实在很多开源软件中前置逗号是经常使用的,它是Haskell语言默认的代码风格。

Node.JS的前负责人isaacs(现npmjs.org负责人,参见:下一阶段的NodeJS) 写过一篇文章,讨论将逗号写在前面的优缺点。讨论中尽管很多人无法适应comma-first。但其中有一条优点无法回避,逗号前移可以很容易发现语法错误。

下段代码的d变量名后面少了一个逗号,这是我们经常犯的一个错误,在一般代码风格中,这个错误是非常不容易被发现的:


  1. // error in standard style
  2. var a = "ape",
  3.   b = "bat",
  4.   c = "cat",
  5.   d = "dog"
  6.   e = "elf",
  7.   f = "fly",
  8.   g = "gnu",
  9.   h = "hat",
  10.   i = "ibu";

但在前置代码规范中,一眼就可以看得出来: 


  1. // error in comma-first style
  2. var a = "ape"
  3.   , b = "bat"
  4.   , c = "cat"
  5.   , d = "dog"
  6.   e = "elf"
  7.   , f = "fly"
  8.   , g = "gnu"
  9.   , h = "hat"
  10.   , i = "ibu"
  11.   ;

前置逗号与"."的连续型写法或者叫做链式写法(可能还有"+")是保持一致的,如:


  1. jQuery
  2.   .ajax('//home/url')
  3.   .done(function() {
  4.   })
  5.   .error(function() {
  6.   })
  7.   .always(function() {
  8.   })

前置逗号在最后新增删除变量时只需要影响一行。而无需删除或添加原来最后一个变量的结束符号。并且前置写法,2个空格的tab即可将变量对齐,2个space可使代码更紧凑。传统写法,需要4个空格的tab才能使变量对齐。


  1. var a = "ape"
  2.   , b = "bat"
  3.   , c = "cat"
  4.   , d = "dog"
  5.   , e = "add new line"  //只影响的一行(添加或删除)
  6.   ;
  7.  
  8. var a = "ape",
  9.     b = "bat",
  10.     c = "cat",
  11.     d = "dog",
  12.     e = "add new line"; //删除此行时需要将前一行d的最后一个逗号同时删除,此时会影响两行;新加时同时删除原有的分号,并换成逗号。此时即易发生输入错误。

另外在Twitter的bootstrap框架中,每个变量都使用var来声明,不用连续声明的方式。而且默认不用分号结束的:

这种格式的代码看上去也比较优美,同时避免了关于逗号的争论:


  1. var a = "ape"
  2. var b = "bat"
  3. var c = "cat"

其实省略分号也是可以借鉴的,所以本文认为比较好的逗号格式应该是这样的:


  1. var one
  2.   , two
  3.   , three
  4.  
  5. var prop = {
  6.     a: 'a'
  7.   , b: 'b'
  8.   , c: 'c'
  9.   , d: 'd'
  10. }

负作用

其实省略分号也有负用,在与闭包结合时会有一些问题,如下段代码:


  1. var a = 1
  2.  
  3. (function() {
  4. console.log(a)
  5. })()
  6.  
  7. // TypeError: number is not a function

 一个错误抛出了,在JS解释执行时,很可能将之合成了1行。


  1. var a = 1 (function() { console.log(a) })()

错误就产生了,所以很多开源框架都会在闭包前置或后置分号,以避免前人无意或故意遗漏分号从而造成错误,正确的写法应该是:


  1. var a = 1
  2.  
  3. ;(function() {
  4. console.log(a)
  5. })()

不使用分号的bootstrap框架也是这么干的,不过bootstrap框架使用了看上去更加高级的+号分隔闭包并后置分号,不过这一套不适合代码与闭包混合使用的场景,还是不要学比较好。


  1. var a = 1
  2.  
  3. + function() {
  4. console.log(a)
  5. } ();
  6.  
  7. //a 的值会变成 NaN

原文发布时间:2014-08-26

本文来自云栖合作伙伴“linux中国”

时间: 2024-11-02 11:43:58

前置逗号之争!的相关文章

现代 JavaScript 开发编程风格Idiomatic.js指南中文版_javascript技巧

你为项目所择风格都应为最高准则.作为一个描述放置于你的项目中,并链接到这个文档作为代码风格一致性.可读性和可维护性的保证. 一.空白 1.永远都不要混用空格和Tab.2.开始一个项目,在写代码之前,选择软缩进(空格)或者 Tab(作为缩进方式),并将其作为最高准则.a).为了可读, 我总是推荐在你的编辑中设计2个字母宽度的缩进 - 这等同于两个空格或者两个空格替代一个 Tab.3.如果你的编辑器支持,请总是打开 "显示不可见字符" 这个设置.好处是:a).保证一致性b).去掉行末的空格

sql多种把查询结果转换成字符串方法

SQL中的叠加(小提示):有如下的需求,用SQL实现把结果集合转换为字符串. 如下: 可以有至少如下三种方法来做转换: 1. 在.NET中通常的做法是先取出结果集放在DataTable中,再利用foreach循环取出每个字段串联起来. 亦如这样,在SQL中也有相同的做法,就是用游标(CURSOR)做循环,示例代码如下:  代码如下 复制代码 Cursor declare @mytable table(Col1 varchar(10))insert into @mytable values('AA

JS魔法堂:ASI(自动分号插入机制)和前置分号

一.前言   今晚在知乎看到百姓网前端技术专家--贺师俊对<JavaScript 语句后应该加分号么?>的回答,让我又一次看到大牛的风采,实在佩服万分.但单纯的敬佩是不足以回报他如此优秀的文字,必须深入理解文字的含义和背后的原理才不愧呢!   在这之前我们需要先理解ASI(自动分号插入机制).   二. Automatic Semicolon Insertion (ASI, 自动分号插入机制)      主要参考:http://justjavac.com/javascript/2013/04/

国家标准前置是战略失误

在产业成熟之前设立http://www.aliyun.com/zixun/aggregation/30825.html">国家标准虽然可以在产业早期重点扶植,站在产业发展的角度却不利于竞争,国家标准前置是战略失误无疑. 近期有两个关于标准的事件引人注目,一是有关HD DVD与蓝光DVD的竞争,最终以东芝HD DVD退出结束,虽然HD DVD的退出前期浪费了东芝的许多资源和投入,但作为同是日本公司的SONY却从中得益,从东芝收购SONY半导体业务来看,东芝从另一层次也获得了补偿,如果日本政府

版署工作人员:魔兽审批权之争将有说法

韩朝 对大家关注的"<魔兽世界>审批权之争",昨日,新闻出版总署的一位工作人员表示对目前媒体报道的情况并不知道,并表示,在一定时间内会有说明. 日前,新闻出版总署发出通知,终止<魔兽世界>审批,退回关于引进出版<魔兽世界>的申请.通知要求,网之易公司(网易公司与美国暴雪娱乐公司的合资公司)立即停止违规行为,纠正错误,停止收费和新账号注册.新闻出版总署将视情依法对其作出相应的行政处罚,包括停止其互联网接入服务. 3日,文化部召开的新闻通气会,就<

手机厂商加入“土豪金”手机大战 与苹果一争市场

原标题:满城尽带"土豪金"自从非黑即白的苹果iPhone终于在推到第五代的时候决定给世界一点颜色瞧瞧之后,于iPhone 5S上首次使用的金色外观就很快在全世界范围内掀起一波购买狂潮,成为其最为紧俏的选色.同时,素来不乏语言创造力的中国内地 网友很快给了苹果这种金色一个无比"接地气"的称号--土豪金.一场关于土豪金支持者与嘲讽者的分野讨论也在各大社交网络上得到了极大关注.与时下泛滥于网络的调侃语"土豪,我们交个朋友吧"如出一辙,网友对于这一香槟金

哥本哈根没有句号只会留下一个逗号

在丹麦哥本哈根举行的联合国天气会议吸引各国关注,在繁华的哥本哈根街头随处可见布满环保气氛的文化艺术作品,各种反映社会环保题目的雕塑作品.图片及标语吸引众多市民和各国人士驻足观看. 中新社发 钱兴强 摄图为哥本哈根街头别具寓意的雕塑作品<融化的北极>. 中新社发 钱兴强 摄 经过十几天的马拉松式谈判,参加哥本哈根天气变化会议的各国代表终于达成初步共鸣,一份被称为"哥本哈根协议"的文件破茧待出.这场"二战以来最重要国际会议"可望有一个比较体面的收场,联合国秘

MFC怎样提取字符串中两个逗号之间 的数据

问题描述 MFC怎样提取字符串中两个逗号之间 的数据 比如字符串: "$GPGGA,024055.00,4002.2168,N,11618.1074,E,1,12,0.0,75.88,M," 怎样提取两个逗号之间的数据,例如"4002.2168"? 我试着使用例如 .Mid(17,14)函数,但是并不好用,因为字符串的长度经常会改变. 解决方案 先用CString的Find找到前后两个逗号的位置,然后在用Mid来截取.这样就可以适应动态变化的字符串 解决方案二: 参

逗号运算符 (,)

运算   顺序执行两个表达式. expression1, expression2 参数 expression1 任何表达式. expression2 任何表达式. 说明 , 运算符使它两边的表达式以从左到右的顺序被执行,并获得右边表达式的值., 运算符最普通的用途是在 for 循环的递增表达式中使用.例如: for (i = 0; i < 10; i++, j++){   k = i + j;} 每次通过循环的末端时, for 语句只允许单个表达式被执行., 运算符被用来允许多个表达式被当作单个