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实现图片放大缩小功能后进行复杂排序的方法
Nov 08 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
Mar 18 Javascript
详解JavaScript的while循环的使用
Jun 03 Javascript
js获取客户端操作系统类型的方法【测试可用】
May 27 Javascript
JS冒泡事件与事件捕获实例详解
Nov 25 Javascript
vue使用自定义icon图标的方法
May 14 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
Sep 18 Javascript
vscode配置vue下的es6规范自动格式化详解
Mar 20 Javascript
微信小程序实现form表单本地储存数据
Jun 27 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
May 13 Javascript
JS异步宏队列与微队列原理区别详解
Jul 02 Javascript
vue将文件/图片批量打包下载zip的教程
Oct 21 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
真正的ZIP文件操作类(php)
2007/07/21 PHP
php抓取https的内容的代码
2010/04/06 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
javascript forEach通用循环遍历方法
2010/10/11 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
js实现查询商品案例
2020/07/22 Javascript
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
Python中私有属性的定义方式
2020/03/05 Python
为什么称python为胶水语言
2020/06/16 Python
详解python 内存优化
2020/08/17 Python
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
怎么写好自荐信
2013/10/30 职场文书
学院书画协会部门职责
2013/11/28 职场文书
初二政治教学反思
2014/01/12 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
公证书标准格式
2014/04/10 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
文明班级建设方案
2014/05/15 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
公司晚会主持词
2019/04/17 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python