彻底放弃javascript句尾分号是怎样的一种体验?

广告位招租
扫码页面底部二维码联系

在《【未经授权禁止转载】我的javascript代码风格原创内容,盗版必究。》中,我给的第一条风格就是“以换行结束一本文版权归作者所有,未经授权不得转载。【转载请注明来源】句语句,而非分号”。其实这个表达是错误的转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net,它真实的表达应该是“不使用分号作为句尾本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】”,也就是说它隐含了两层意思:1.句尾无【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。分号;2.要正确处理语句结束的问题。在经【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net过几个月的实践之后,今天就来谈谈彻底放弃【本文受版权保护】【关注微信公众号:wwwtangshuangnet】使用分号作为句尾的感受。

【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net【转载请注明来源】

这里需要强调一下,“句尾”是指语句结束,【本文受版权保护】【原创内容,转载请注明出处】而不是说这一行代码结束,不是说任何地方都【转载请注明来源】著作权归作者所有,禁止商业用途转载。可以省略分号,有两个地方的分号是不能省的未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】,一个是for循环语句括号中的分号,另一【版权所有,侵权必究】【作者:唐霜】个是空语句。下文所有“不使用分号”都是指【原创不易,请尊重版权】原创内容,盗版必究。“不使用分号作为句尾【转载请注明来源】”。【原创不易,请尊重版权】

【版权所有,侵权必究】原创内容,盗版必究。未经授权,禁止复制转载。

为什么不再使用分号作为句尾未经授权,禁止复制转载。

【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。

越来越多的代码不再使用分号是有原因的,我本文作者:唐霜,转载请注明出处。【作者:唐霜】个人认为主要有以下几点原因:

【版权所有,侵权必究】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

审美的需要【转载请注明来源】

【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】

从代码本身而言,所有句尾分号其实都没有实【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net际意义,它不代表任何执行逻辑(空语句除外【转载请注明来源】【关注微信公众号:wwwtangshuangnet】),对于我个人而言,可以把这些分号全部当原创内容,盗版必究。【转载请注明来源】做空语句来看,再每一个语句结束执行一条空未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。语句,它反而是一种另类的写作风格。使用空著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】语句的极端案例,是用代码作画,但凡需要填【本文受版权保护】本文作者:唐霜,转载请注明出处。充的位置就使用分号,因为分号是空语句,代【转载请注明来源】【版权所有】唐霜 www.tangshuang.net码不会报错,怪才们利用这个特性把代码活生【本文受版权保护】本文版权归作者所有,未经授权不得转载。生画成了画。

【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】

但是,对于普通项目而言,不可能允许代码作【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net画。极简主义时代,省略分号让代码更加美观【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net。当然,为了迎合这种什么,当代的代码写作【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。除了放弃分号外,还有另外一些改变,比如喜本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。欢将声明分开,而不是使用逗号放在一起。这【原创不易,请尊重版权】原创内容,盗版必究。谈不上好坏,仅仅是个人偏好而已,如果在乎【原创不易,请尊重版权】原创内容,盗版必究。审美,那么这点姑且可以当做是省去分号的优【转载请注明来源】【版权所有】唐霜 www.tangshuang.net点。

转载请注明出处:www.tangshuang.net【未经授权禁止转载】【作者:唐霜】【关注微信公众号:wwwtangshuangnet】

有利于后期代码添加未经授权,禁止复制转载。

本文作者:唐霜,转载请注明出处。【本文受版权保护】【关注微信公众号:wwwtangshuangnet】

有分号的情况下,后期如果有跟随代码,就必本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】须先去掉这个分号,然后在写跟随代码,而如【作者:唐霜】【关注微信公众号:wwwtangshuangnet】果不添加分号,则新代码可以直接加上去。而著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net且现在更喜欢每一个操作独自一行,一般这种【未经授权禁止转载】【原创内容,转载请注明出处】添加,都会在换行之后再操作。在git的管原创内容,盗版必究。【原创内容,转载请注明出处】理工具中,这一行新添加的代码不会带来文件【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。修改的效果,从某种意义上讲,这也是审美心【原创内容,转载请注明出处】【作者:唐霜】理的结果。包括每个操作单独成行,其实也是原创内容,盗版必究。【作者:唐霜】审美心理的结果。

本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【本文受版权保护】著作权归作者所有,禁止商业用途转载。
gulp.src('**/*.js')
  .pipe(minify())
  .pipe(gulp.dest('./dist'))

例如上面这段代码,要在dest之后再添加本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。on相关代码,只需要换行后添加即可。为了原创内容,盗版必究。【本文受版权保护】实现有利于后期代码添加,除了省略分号,大本文作者:唐霜,转载请注明出处。原创内容,盗版必究。家还乐于使用换行和逗号,即对象、数组、参【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net数等都一行写一个元素,而且最后一个元素添未经授权,禁止复制转载。【本文受版权保护】加逗号,这样下次追加元素的时候不必再手动【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】添加这个逗号。

【转载请注明来源】本文作者:唐霜,转载请注明出处。【作者:唐霜】

自动插入分号机制(ASI)【版权所有,侵权必究】

【本文首发于唐霜的博客】【本文受版权保护】【作者:唐霜】【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。

JS引擎能够自动处理未以分号结尾的语句,转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。它根据ASI的规则来确定语句的结束,而不原创内容,盗版必究。原创内容,盗版必究。是代码中的分号。因为ASI的存在,导致J著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。S是一门在引擎解释时必须以分号作为语句结原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】尾标志的语言。也就是说,引擎是无法自己识【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net别语句是否结束,而必须依靠ASI。然而A【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.netSI给开发者留下了坑,它会导致你写代码时转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。得到非预期的执行结果。主要有一下几个坑:

【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】
后缀表达式
  左值表达式 [无行终结符] ++
  左值表达式 [无行终结符] --Continue 语句
  continue [无行终结符] 标识符? ;Break 语句
  break [无行终结符] 标识符? ;Return 语句
  return [无行终结符] 表达式? ;Throw 语句
  throw [无行终结符] 表达式? ;

上面这几种情况需要额外注意,稍不留神就会【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。被坑。

【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】未经授权,禁止复制转载。
a = 10a++

上面这个代码会被解释为:【未经授权禁止转载】

本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】
a = 10;a;++;

也就是说【版权所有】唐霜 www.tangshuang.neta ++操作必须写在同一行内。当然,单独放置++【本文首发于唐霜的博客】原创内容,盗版必究。为一行的情况我们一般不会让它发生,但是下本文作者:唐霜,转载请注明出处。原创内容,盗版必究。面这个情况稍不留神就会发生:

【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【本文受版权保护】
function a() {
  return
  {
  
  a: 10
  }}

上面这段代码return单独一行会导致语【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。句在它后面直接结束,后面跟随的内容不会作【原创不易,请尊重版权】【本文首发于唐霜的博客】为返回值,因此,如果你想要在return未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。后给返回值,一定要和return在同行。

【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net

只要注意上面这些情况,就可以避免ASI机【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】制带来的坑。而这些坑也证明一个事实:即使你严格按照代码风格使用分号,也有可能【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】造成错误。所以,关于加不加分号的争论并没有涉及问【版权所有,侵权必究】转载请注明出处:www.tangshuang.net题本质,问题本质是要理解ASI机制。

本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【版权所有,侵权必究】

放弃使用分号作为句尾的注意点【未经授权禁止转载】

【作者:唐霜】【本文首发于唐霜的博客】【本文受版权保护】

不使用分号的缺点是什么呢?我的回答是:完【作者:唐霜】本文版权归作者所有,未经授权不得转载。全没有!它不会带来任何语法错误,也不会导著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】致阅读代码的理解障碍。很多人会觉得不使用本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。分号会带来一些弊端,但实际上,写分号也无【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】法避免这些弊端。使不使用分号,只是选择问本文版权归作者所有,未经授权不得转载。【转载请注明来源】题,而不存在好坏善恶之分,会出问题的代码【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。,使用分号仍然会出问题,不使用分号的代码转载请注明出处:www.tangshuang.net【转载请注明来源】,只要习惯了写作风格,也不会有任何问题。

著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。

不写分号确实需要有几个注意点,你需要深刻【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net理解语句与语句之间的关系,让你的代码更加【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】严谨。这里推荐一篇文章【原创内容,转载请注明出处】,里面总结了主要的几个注意点,本文就再梳原创内容,盗版必究。【转载请注明来源】理一下。

【版权所有】唐霜 www.tangshuang.net【作者:唐霜】【转载请注明来源】

当你不使用分号作为句尾的时候,你的注意点本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net应该放到句首。也就是说,当你打算写一个语著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】句的时候,首先应该稍做思想的暂停,确定你本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。是否应该这样开始这条语句。当你打算用“(【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net”、“[”、“/”、“+”、或“-”开始【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】这几个符号开始这条语句时,就要格外小心,【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。因为它们在js中存在两种不同的意义,用汉【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】语里的“一词多义”来解释正好。

【未经授权禁止转载】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。

(前括号有两种意义:1.提高优先级,2.【本文受版权保护】原创内容,盗版必究。函数的参数。当然,在正则表达式中还有分组未经授权,禁止复制转载。【原创不易,请尊重版权】的意思。如何确定是哪种意义呢?[前中括号【未经授权禁止转载】转载请注明出处:www.tangshuang.net也有两种意义:1.字面量数组的前中括号,转载请注明出处:www.tangshuang.net【未经授权禁止转载】2.数组索引下标的前中括号。你也无法确定本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】是在使用哪一种。/则有正则regexp的著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net前斜杠和除号两种意义。而不同的意义会导致【本文受版权保护】转载请注明出处:www.tangshuang.netjs选择不同的方式对它们进行处理。

本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。

如果(前方是变量(或常量),它总是被认为【原创内容,转载请注明出处】【本文受版权保护】是function的实参的前括号;如果[的前方是变量(包括匿名函数,或常量【版权所有,侵权必究】【原创内容,转载请注明出处】),它总被认为是数组的下标的前中括号;如果/的前方也存在变量(或常量),它总被本文版权归作者所有,未经授权不得转载。【转载请注明来源】认为是除号。

【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。【版权所有,侵权必究】

+和-情况稍有不同,因为单纯看+只有加法本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】的加号和字符串连接符的意思,但是其实这两【转载请注明来源】本文版权归作者所有,未经授权不得转载。种意义在用法上是一致的,字符串连接符只是著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。做了数据类型的转换。当出现++的时候情况转载请注明出处:www.tangshuang.net【转载请注明来源】则会改变,例如

【原创内容,转载请注明出处】未经授权,禁止复制转载。【本文受版权保护】
x++y

会被认为是【关注微信公众号:wwwtangshuangnet】x; ++y;,而非【本文受版权保护】x++;y。还有一种情况,叫做单目运算,其实是一种【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net省略的写法如:

【原创内容,转载请注明出处】【转载请注明来源】【转载请注明来源】
10 + +'12'10 + -'12''12'- - 10

++代表的是自加,而+ +则代表第二个加未经授权,禁止复制转载。【本文受版权保护】号为正号,即后面是一个正数,同理- -的未经授权,禁止复制转载。【版权所有,侵权必究】第二个减号代表后面是一个负数。但这都不会本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】代码我们本文中分号带来的问题,我们要看的原创内容,盗版必究。【本文首发于唐霜的博客】,是第一个+,也就是除开++自加运算的单【本文受版权保护】【原创不易,请尊重版权】独一个加号的情况。所以,+号和-号的两种【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。意义分别是:加减运算和正负单目运算。

【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【作者:唐霜】

如果+或-前面是一个变量(或常量),它总【转载请注明来源】【本文受版权保护】被认为是加减运算,而非正负号;反过来,如未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net果它前面不是变量(或常量),则表示正负号【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。
【本文首发于唐霜的博客】原创内容,盗版必究。 例如:【未经授权禁止转载】

未经授权,禁止复制转载。【原创内容,转载请注明出处】【未经授权禁止转载】【版权所有,侵权必究】【转载请注明来源】
12-4 + 6
'19' ++'9' - 6// 这是一个非常有趣的例子,你可以自己运行试试看

因此,所有以([/+-开头的语句,都必须【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】谨慎行事。

转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【未经授权禁止转载】

但是,这种使用往往是因为开发者希望一次性【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net完成复杂运算,利用最多的如下:

【本文受版权保护】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net
['click', 'hover', 'mousedown'].forEach(e => bind(ele, e, factory))

想一次性通过[]来绑定一些事件。但是这种【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。用法非常危险,因为[前面如果是变量(或常著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。量)就极有可能引起错误。当然,使用分号可【原创不易,请尊重版权】未经授权,禁止复制转载。以解决,在[前面加分号成为;[,但是这种【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。前置分号的写法非常不符合我的审美,所有前【未经授权禁止转载】原创内容,盗版必究。置符号的形式都不大受我的欢迎。我推荐的简本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】单的方法如下:

转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【原创内容,转载请注明出处】
var events = ['click', 'hover', 'mousedown']events.forEach(e => bind(ele, e, factory))

把复杂语句拆分成两个简单语句。虽然代码量本文版权归作者所有,未经授权不得转载。【本文受版权保护】增加了,但是感官上更加明了,events本文版权归作者所有,未经授权不得转载。【本文受版权保护】变量也可以复用。当然,你可能觉得even【本文受版权保护】未经授权,禁止复制转载。ts只用到一次,不应该多增加一个变量。即【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net使如此,你也不应该将[]作为句首,你可以【本文首发于唐霜的博客】【本文首发于唐霜的博客】采用函数立即执行的方式来释放内存:

【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】
!function(){
  var events = ['click', 'hover', 'mousedown']
  events.forEach(e => bind(ele, e, factory))}()

前面使用了!而非采用双括号的形式执行函数原创内容,盗版必究。【未经授权禁止转载】,也是为了避免(作为句首带来的问题。

【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

我在自己的风格文档里面的建议是:【关注微信公众号:wwwtangshuangnet】使用变量作为句首【版权所有,侵权必究】。当然这不是必须的,有的时候为了写出具有原创内容,盗版必究。【版权所有,侵权必究】个性的代码,必须尝试使用一些非一般的手段【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。,这个时候,只需要注意本文涉及的知识点即【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net可。

【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。

2017-04-23 11060

为价值买单,打赏一杯咖啡

本文价值110.6RMB
已有3条评论
  1. falls 2021-02-17 13:26

    今天就遇到一个坑:
       js = load_file_from_disk(filename)
       然后调用  webView.evaluateJavascript(js)

    因为 写 js的人,是没有加分号的,然后 eval 一直不工作
    而且 eval 里还不能有  // 类型的注释, 必须用 /* */

    • 否子戈 2021-02-17 14:27

      也是一种场景,应该把对应的js进行编译后保存

  2. roastwind 2019-10-22 14:26

    ’19’ ++’9′ – 6  ,现在chrome上,这样的js语句已经报错了
    Uncaught SyntaxError: Invalid left-hand side expression in postfix operation
    ++’9’,或者++9,都会报这个错误,

    关于运算符优先级https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence,
    ++大于+

    改成下面这样的,就没有问题了
    var i = ‘9’
    ’19’ + (++i) – 6