javascript 分号总结及详细介绍

时间:2021-05-28

javascript每条语句都是以分号结束,但由于javascript具有分号自动插入规则,所有不同的编程人员有不同的习惯,有的加分号,有的不加分号,那么到底加分号好还是不加分号好?本文章向大家探讨javascript每条语句该不该加分号。

javascript的分号代表语句的结束符,但由于javascript具有分号自动插入规则,所以它是一个十分容易让人模糊的东西,在一般情况下,一个换行就会产生一个分号,但实际情况却不然,也就是说在javascript中换行可能产生分号,也可能不产生,是否自动插入分号,主要看上下行。所以即使是经验丰富的程序员,有时候也会头大。

JavaScript自动加分号规则:

  • 当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。
  • 当有}时,如果缺少分号,会补分号。
  • 当程序源代码结束时,如果缺少分号,会补分号。
  • 接下来我们来分组看不加分号导致的语法歧义:

    第一种是++和--两种运算符出现在上一行结尾的情况,下一行以以下开头时,会产生语法歧义:
    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引起的血案:

    function test(){ var a = 1; var b = 2; return //会自动插入分号 ( a+b )};alert(test());

    一个返回a+b值的函数,初看没任何问题,但运行alert的结果却是undefined。根据分号的自动插入规则,return 语句后面如果有换行就会自动插入分号,没有返回值也就比较好理解了。如果需要换行的话,可以这样:

    function test(){ var a = 1; var b = 2; return ( a+b )};alert(test());

    两个闭包引起的血案:

    (function (){ var a;})() //不会自动插入分号(function (){ var b;})()

    很诡异,解释不了,谁能告诉我~

    for语句头中的两个分号,不自动插入分号

    for( var a=1,b=10 //不会自动插入分号 a<b //不会自动插入分号 a++ ){}

    总结

  • 在return、break、continue、后自增、后自减五种语句中,换行符可以完全替代分号的作用。
  • var if do while for continue break return with switch throw try debugger几种关键字开头的语句,以及空语句,上一行加不加分号影响不大。
  • 凡表达式语句和函数表达式语句,后面不加分号非常危险,情况极其复杂。
  • 凡(和[开头的语句,前面不加分号极度危险。
  • 以上就是对JavaScript 分号的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章