JavaScript自动加分号规则,有3条
利用我自己的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 ;
接下来我们来分组看不加分号导致的语法歧义:
总结,
下面在通过实例代码介绍下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语句后面的分号问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
我想遍历选项的列表。如果其中有一个值,我想返回一个错误。下面是一个人为的例子: 添加另一个分号会导致错误,但删除分号不会导致错误。 为什么return语句后面的分号是可选的? 习惯用法Rust应该使用哪种形式:分号还是不使用分号?这两种方法都被编译器接受,并且似乎产生相同的结果。
问题内容: 如果您不熟悉规则。这是关键点: 如果第一至第n 个 JavaScript程序形式的令牌是语法上有效,但第一至第n+1个ST令牌是不与存在n之间的换行符个令牌和第n+1ST令牌,则解析器试图插入n个令牌之间的虚拟分号后再次解析程序次和第n + 1 ST令牌。 该描述可能是不完整的,因为它没有解释@Dreas的示例。有人可以链接到完整的规则,还是可以查看示例为何使用分号?(我在JScrip
问题内容: 今天,在搜索错误半小时之后,我发现可以在if语句后加上分号而不是代码,如下所示: 从根本上讲,这意味着无论是否相等,都将完成工作,并且该语句毫无意义。Java为什么不给我一个错误?有什么情况会有用吗? 问题答案: Why does it happen? Java语言规范说: 空话 空语句不执行任何操作。 空语句的执行总是正常完成 从本质上讲,这意味着你要在a == b时执行空语句 Wh
我在系统的分号后面加了一个分号。出来打印ln: 这对Java编译器来说是合法的,所以我检查了其他语句,它们也都是合法的。所以当我搜索并找到这些链接时: > 为什么Java在语句末尾不显示双分号错误? 当我用两个分号结束一行时,编译器并没有抱怨。为什么? 什么时候在方法结束括号后面加上分号? 为什么使用连续分号的代码会编译? “if”语句末尾的分号 我开始明白一个额外的分号意味着一个额外的空语句。
对于我的Java类,要求我们在working For语句中添加分号,并解释为什么输出是这样的。我不明白为什么添加分号会产生错误的树类型错误,导致代码无法编译。代码下面是输出;我还向any标记添加了反斜杠,因为它不会以其他方式显示。那么,为什么for语句后面的分号会导致这样的错误呢?提前谢谢。 运行时间: