javascript 分号总结及详细介绍


Posted in Javascript onSeptember 24, 2016

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 分号的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
js css样式操作代码(批量操作)
Oct 09 Javascript
jQuery前台数据获取实现代码
Mar 16 Javascript
jQuery学习笔记之jQuery动画效果
Sep 09 Javascript
Javascript实现视频轮播在pc端与移动端均可
Sep 29 Javascript
node.js中的path.join方法使用说明
Dec 08 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
Aug 13 Javascript
js实现带圆角的多级下拉菜单效果
Aug 28 Javascript
JavaScript中eval()函数用法详解
Dec 14 Javascript
Angular 表单控件示例代码
Jun 26 Javascript
angular实现spa单页面应用实例
Jul 10 Javascript
vue中$refs的用法及作用详解
Apr 24 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
Aug 09 Javascript
Bootstrap对话框使用实例讲解
Sep 24 #Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
Sep 24 #Javascript
angular.js之路由的选择方法
Sep 24 #Javascript
用js写的一个路由(简单实例)
Sep 24 #Javascript
简单的js表格操作
Sep 24 #Javascript
js面向对象实现canvas制作彩虹球喷枪效果
Sep 24 #Javascript
轻松实现js选项卡切换效果
Sep 24 #Javascript
You might like
配置最新的PHP加MYSQL服务器
2006/10/09 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
javascript 获取表单file全路径
2009/12/31 Javascript
javascript跨域刷新实现代码
2011/01/01 Javascript
js确定对象类型方法
2012/03/30 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
python实现异步回调机制代码分享
2014/01/10 Python
Python和php通信乱码问题解决方法
2014/04/15 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
Python中一行和多行import模块问题
2018/04/01 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
对python判断是否回文数的实例详解
2019/02/08 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
2019/08/20 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
GC是什么?为什么要有GC?
2013/12/08 面试题
英文版区域经理求职信
2013/10/23 职场文书
讲党性心得体会
2014/09/03 职场文书
苏州园林导游词
2015/02/03 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL