javascript 分号总结及详细介绍

 更新时间:2016年09月24日 14:27:24   投稿:lqh  
这篇文章主要介绍了javascript 分号总结及详细介绍的相关资料,需要的朋友可以参考下

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

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

JavaScript自动加分号规则:

  1. 当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。
  2. 当有}时,如果缺少分号,会补分号。
  3. 当程序源代码结束时,如果缺少分号,会补分号。

接下来我们来分组看不加分号导致的语法歧义:

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

总结

  1. 在return、break、continue、后自增、后自减五种语句中,换行符可以完全替代分号的作用。
  2. var if do while for continue break return with switch throw try debugger几种关键字开头的语句,以及空语句,上一行加不加分号影响不大。
  3. 凡表达式语句和函数表达式语句,后面不加分号非常危险,情况极其复杂。
  4. 凡(和[开头的语句,前面不加分号极度危险。

以上就是对JavaScript 分号的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

相关文章

  • 原生JS实现《别踩白块》游戏(兼容IE)

    原生JS实现《别踩白块》游戏(兼容IE)

    本文主要介绍了原生JS实现《别踩白块》游戏(兼容IE)的示例代码。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • js中遍历Map对象的简单实例

    js中遍历Map对象的简单实例

    下面小编就为大家带来一篇js中遍历Map对象的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • 详解html-webpack-plugin用法全解

    详解html-webpack-plugin用法全解

    这篇文章主要介绍了详解html-webpack-plugin用法全解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • javascript实现框架高度随内容改变的方法

    javascript实现框架高度随内容改变的方法

    这篇文章主要介绍了javascript实现框架高度随内容改变的方法,实例分析了通过父页面及内容改变框架高度两种实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • js实现简单的可切换选项卡效果

    js实现简单的可切换选项卡效果

    这篇文章主要介绍了js实现简单的可切换选项卡效果的方法,涉及javascript操作css样式实现切换选项卡的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • 详解JS 比较两个Json对象的值是否相等的实例

    详解JS 比较两个Json对象的值是否相等的实例

    这篇文章主要介绍了JS 比较两个Json对象的值是否相等的实例,有需要的朋友可以参考一下
    2013-11-11
  • JavaScript实现PC端横向轮播图

    JavaScript实现PC端横向轮播图

    这篇文章主要为大家详细介绍了JavaScript实现PC端横向轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • HTML+JavaScript实现筋斗云导航栏效果

    HTML+JavaScript实现筋斗云导航栏效果

    这篇文章主要为大家介绍了如何利用HTML+JavaScript+CSS实现筋斗云导航栏效果,当鼠标经过某个li,筋斗云跟着到当前的位置,感兴趣的小伙伴可以试一试
    2022-03-03
  • js实现倒计时关键代码

    js实现倒计时关键代码

    这篇文章主要为大家详细介绍了js实现倒计时的关键代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 利用OpenAI ChatGPT进行编码尝试体验

    利用OpenAI ChatGPT进行编码尝试体验

    这几天chatgpt可是非常火的,下面这篇文章主要给大家介绍了关于利用OpenAI ChatGPT进行编码尝试体验的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12

最新评论