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 相关文章推荐
解决 firefox 不支持 document.all的方法
Mar 12 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
Dec 26 Javascript
jquery实现图片灯箱明暗的遮罩效果
Nov 15 Javascript
禁用Enter键表单自动提交实现代码
May 22 Javascript
使用CoffeeScrip优美方式编写javascript代码
Oct 28 Javascript
Javascript中浏览器窗口的基本操作总结
Aug 18 Javascript
HTML5 js实现拖拉上传文件功能
Nov 20 Javascript
浅谈react.js 之 批量添加与删除功能
Apr 17 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
Sep 20 Javascript
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
Jan 16 Javascript
javascript代码简写的几种常用方式汇总
Aug 23 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
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
PHP 编程安全性小结
2010/01/08 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
Prototype Function对象 学习
2009/07/12 Javascript
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现的各种排序算法代码
2013/03/04 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
Python之用户输入的实例
2018/06/22 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
历史学专业个人的自我评价
2013/10/13 职场文书
初中作文评语大全
2014/04/23 职场文书
2014领导干部四风问题查摆思想汇报
2014/09/13 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
Django实现翻页的示例代码
2021/05/24 Python