JavaScript自动加分号规则,有3条
- 当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。
- 当有}时,如果缺少分号,会补分号
- 当程序源代码结束时,如果缺少分号,会补分号。
利用我自己的JS语法分析工具JSinJS(https://github.com/kissjs/JSinJS ),我求出了所有能够出现在语句第一个的JS语法标记 (就是Statement的first集合),他们是:
["debugger", "try", "throw", "switch", "Identifier", "with", "return", "break", "continue", "for", "while", "do", "if", "new", "function", "(", "{", "[", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "this", "!", "~", "-", "+", "--", "++", "typeof", "void", "delete", ";", "var"]
共计35个。
我又求出了所有可以出现在分号之前的语法标记(即去掉分号以后的last集),他们是
["--", "++", "IdentifierName", "]", ")", "}", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "Identifier", "this", "debugger", "return", "break", "continue"]
共计17个。
35*17 = 595种组合,为了方便记忆,以下我分组来讨论语法歧义 。(本来用Excel弄了张表,不过表太大了不好贴出来)
首先,以下语法标记开头的语句是绝对安全的,不会跟不加分号的上一行产生任何歧义:
var if do while for continue break return with switch throw try debugger ;
接下来我们来分组看不加分号导致的语法歧义:
- 第一种是++和--两种运算符出现在上一行结尾的情况,下一行以以下开头时,会产生语法歧义:
- function delete void typeof new null true false NumericLiteral StringLiteral RegularExpressionLiteral ( [ { Identifier ++ -- + - ~ !
- 其中,function和delete是非常常用的statement开头。
- 特别是 ++和--单独被断为一行的时候,因为JS的语法规则规定后自增运算不允许中间插入换行,所以++和--会被视为前自增而跟下一行连接在一起。
- 第二种是return作为上一行结尾的情况,下一行以以下开头时,会产生语法歧义:
- function delete void typeof ( [ { Identifier ++ -- + - ~ !
- 同样因为JS语法的规则不允许在return 和后面的值之间插入换行,所以return之后只要有换行符就会视为有分号,这常常会与使用者的期望不符合。
- 第三种是下一行以+和-开头的情况,上一行以以下结尾是,会产生语法歧义:
- -- ++ IdentifierName ] ) } RegularExpressionLiteral
- 因为很少有语句以+或者-开头,所以这种情况不算危险。
- 第四种是上一行以break、continue结尾的情况,下一行以Identifier开头时,会产生语法歧义。
- 第五种是下一行以(和[开头的情况,上一行以以下结尾是,会产生语法歧义:
- -- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this
- 这种情况非常危险(所以hax的文章中要提出这种情况应该语句前写分号),几乎上一行的所有情况都将导致正常期望之外的结果。
- 第六种是,当下一行以RegularExpressionLiteral 开头的情况,上一行的以下结尾,会导致/被理解为除号:
- -- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this
总结,
- 在return、break、continue、后自增、后自减五种语句中,换行符可以完全替代分号的作用。
- var if do while for continue break return with switch throw try debugger几种关键字开头的语句,以及空语句,上一行加不加分号影响不大。
- 凡表达式语句和函数表达式语句,后面不加分号非常危险,情况极其复杂。
- 凡(和[开头的语句,前面不加分号极度危险。
下面在通过实例代码介绍下JavaScript中的分号问题
一般在比较懒的前台程序员中经常会碰到一些莫名其妙的问题。
今天仅讨论一下在JS中经常会碰到一些关于分号的问题。JavaScript这门语言是可以省略分号的,是因为它会换行符后如果缺少分号就会无法编译时它会默认添加上分号,但是在一些特定情况下他是不会默认添加分号的。现在简单介绍一下需要注意的几个地方。
在这种情况时:
var x = 0 [x+1,x+2,x+3].forEach(function(){ console.log(x) })
这种情况下会导致程序无法正常运行。JavaScript在解析这段代码是并不会在var x = 0后换行。
在写代码时如果以一条语句以 ”(” ,"[" ,"+" ,"-" ,"/" 开始时通常在上一条语句不会默认添加分号的。所以在这种情况下尽量保持一下这种写法,在以这些字符开始时在行首添加一个分号,这样可以保证在别人更改上面代码时不加分号也不会影响以下代码运行。
var x = 0 ;[x+1,x+2,x+3].forEach(function(){ console.log(x) })
还有就是在涉及 return break continue 这种语句时尽量不要换行
return true; JavaScript会解析为 return; true; 在涉及 ++ 和 -- 这一系列运算时 在作为表达式的前缀或后缀时在换行是会有一定的问题,如下情况: var x = 0; var y = 0; x ++ y
JavaScript会解析为
x;++y; 而不是 x++;y;
虽然在JavaScript这门语言中 “;” 是可以省略不写的,但是还是建议大家每句代码后都跟上 “;” 养成这种良好的编码习惯,毕竟在大多语言中不带 “;” 的编码适不适用的。
总结
以上所述是小编给大家介绍的JavaScript语句后面的分号问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]