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 相关文章推荐
JavaScript Date对象 日期获取函数
Dec 19 Javascript
仿猪八戒网左下角的文字滚动效果
Oct 28 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
Aug 01 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
Oct 17 Javascript
JS实现点击按钮自动增加一个单元格的方法
Mar 09 Javascript
JS实现漂亮的时间选择框效果
Aug 20 Javascript
原生Javascript和jQuery做轮播图简单例子
Oct 11 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
Dec 09 Javascript
详解js类型判断
May 22 Javascript
vue watch深度监听对象实现数据联动效果
Aug 16 Javascript
JavaScript实现答题评分功能页面
Jun 24 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 fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
2013/11/26 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
iframe实用操作锦集
2014/04/22 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
微信小程序音乐播放器开发
2019/11/20 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
python获取txt文件词向量过程详解
2019/07/05 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
生物科学系大学生的自我评价
2013/12/20 职场文书
顶岗实习计划书
2014/01/10 职场文书
家长评语大全
2014/01/22 职场文书
消防应急演练方案
2014/02/12 职场文书
学校联谊活动方案
2014/02/15 职场文书
培训班通知
2015/04/25 职场文书
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL