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游戏之是男人就下100层代码打包
Nov 08 Javascript
JS trim去空格的最佳实践
Oct 30 Javascript
Ajax搜索结果页面下方的分页按钮的生成
Apr 05 Javascript
JavaScript 创建运动框架的实现代码
May 08 Javascript
JS功能代码集锦
May 04 Javascript
ECMAScript6--解构
Mar 30 Javascript
jQuery实现键盘回车搜索功能
Jul 25 jQuery
微信小程序实现循环动画效果
Jul 16 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
Sep 18 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
Jul 22 jQuery
Element-Ui组件 NavMenu 导航菜单的具体使用
Oct 24 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
Jul 26 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二维数组的去重问题解析
2011/07/17 PHP
PHP eval函数使用介绍
2013/12/08 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
nginx 设置多个站跨域
2021/03/09 Servers
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
ES7之Async/await的使用详解
2019/03/28 Javascript
vue3中轻松实现switch功能组件的全过程
2021/01/07 Vue.js
numpy linalg模块的具体使用方法
2019/05/26 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python读取指定字节长度的文本方法
2019/08/27 Python
python标识符命名规范原理解析
2020/01/10 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
中科方德软件测试面试题
2016/04/21 面试题
国庆节文艺活动方案
2014/02/03 职场文书
索桥的故事教学反思
2014/02/06 职场文书
商场促销活动方案
2014/02/08 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
护士2015年终工作总结
2015/04/29 职场文书
环保建议书作文300字
2015/09/14 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
学生检讨书范文
2019/06/24 职场文书