关于javascript中的(;),为可选的分号
在阅读jQuery源码的时候,发现一个小东西神出鬼没,它就是(;)。因此,为确保阅读的流畅性,从JQuery中跳出来,折腾一下javascript中的语句结束分隔符(注:这自是个人理解中的称呼),下面简称javascript为JS。
在编程语言中,基本都是使用分号(;)将语句分隔开。从感觉上讲,这可以增加代码的可读性和整洁性。
缺少分隔符(;),一条语句的结束就成了下一条语句的开始,而在JS中,如若语句各占独立一行,通常可以省略语句间的分号(;),当然,右花括号(})处和程序结尾处的分号(;)也是可以省略的。
说到这里,我想从编程风格方面说下,一种是尽量不用(;),除非迫不得已,在任何可以省略(;)的地方都将其省略;一种是只要有机会,就用(;),以明确语句的结束。由于本人是C++出身的,早已经习惯了用分号结束语句,故此,我是偏向于第二种风格。无论那种风格的,都有必要去理解JS的解析规则,方便于去阅读使用他人的代码。
下面由简入难
var a=1;
var b=2;
//因为是分行的语句,所以第一个分号(;)是可以省略的。
当习惯用一行语句定义多个变量
var x=1;var y=3;
//这种书写格式,明显第一个分号不能省略
上面的代码中,JS解析器是自动在换行补充分号(;)的,但它不是在所有的换行处都自动补充(;)的。
解析器是遵循以下的的规则,即是在缺少了(;),就无法正确解析代码的时候,解析器才会填充。换言之,这家伙很懒,如果不是当前的语句无法和随后的非空格字符当成一个整体解析的话,它不会干填充(;)的活。
例如:
var e
e
=
1
example(e)
//会解析为var e; e=1; example(e);
因为无法解析var e e,所有就在其换行处自动填充上(;)。
那么,问题来了,这些分隔规则会带来一些意想不到的状况。
例如:
var x = f
(a+b).toString()
//看似两独立的语句,实则被解析为var x=f(a+b).toString();
如果程序中没有f()函数,错误还算容易排查,但若有着f()函数,这...会造成巨大的困扰。
那么,在程序中,“(, {, [ ,\, +, - ”这些字符开始的语句,就存在以上的风险,尤其是“(”,"["开始的语句是较为常见的。故,我们会看到一些程序员在代码开始之前添加上分号(;)。
例如
var x=0 //这里省略分号;[x,x+1,x+3].forEach(console.log)
//前面有了个分号,自然可以确保语句被正确的解析
凡事都有例外。js肯定也是。return 、break、continue就是特殊的。这三个家伙,如果后面紧跟换行,解析器一定会自动在后面填充分号(;)。
return
true
//会被自动填充分号,被解析为return;true;这种结果一定不是你想见到的,因为在调试的时候,基本不是被报错。
所以,在这三个特殊关键字表达式作用前后,须得注意换行问题。
最后,还有个歧义问题。看如下代码,
a
++
b
//这时候,会被解析成什么样呢?
//a;++b;
//我想大概,本意是希望运行var a++;b;
在学习C++的时候,很讨厌一些题目,比如说 a=3;b=4;求++a+++b;其实结果不是一定的,因为有些编译器是左运算,而有些是右运算。我想这些题目大概是要告诫我们,在关于运算时,写的语句一定不能造成歧义,不然平台换了,结果也变了。
由彼及此,在JS中,有歧义的东西,不同的浏览器引擎也是要统一也是很艰难的。所以,如果能加些括号、标点,能让大家伙都看的懂。付出点代价是值得的。
注:a++的运行效率确实比a=a+1要高上一些。
综上,可选的分号。能省不要省。
关于javascript中的(;),为可选的分号相关推荐
- JavaScript中到底要不要写分号呢?
在我们介绍 JavaScript 语法的全局结构之前,我们先要探讨一个语言风格问题:究竟要不要写分号? 这是一个非常经典的口水问题,"加分号"党和"不写分号"党 ...
- JavaScript 权威指南笔记 - 可选的分号
分号 只有缺少分号无法正确解析代码的时候会自动添加分号 var a a = 3 => var a; a = 3; var y = x + f (a + b).toString() => v ...
- JavaScript中的运算符和语句
一.JavaScript的运算符 a.基本的算术运算符(+.-.*./.%) -.*./.%运算符会在必要的时候将操作数转换为数字,无法转换成数字的操作数将会转换成NaN,相应的运算结果也是NaN. ...
- html分号的作用,JavaScript 中的分号(;) – JavaScript 完全手册(2018版)
注:本文为 < JavaScript 完全手册(2018版) >第14节,你可以查看该手册的完整目录. JavaScript 中的分号是可选的. 我个人偏好是我的代码中避免使用分号,但也有 ...
- JavaScript 中语句的分号及webstorm对其的设置
在 C 语言中,分号是语句结束的标志,在语句结束的地方一定要以分号结束.而 JavaScript 的分号却是可选的,若语句都各占一行,则可以省略分号.这是因为 JavaScript 中的 ASI 机制 ...
- javascript 分号_让我们谈谈JavaScript中的分号
javascript 分号 要使用它们,还是不使用它们- (To use them, or not to use them-) Semicolons in JavaScript divide the ...
- 有没有更好的方法在JavaScript中执行可选的函数参数? [重复]
本文翻译自:Is there a better way to do optional function parameters in JavaScript? [duplicate] This quest ...
- JavaScript中分号;的使用注意
在javaScript中分号是可以选用的,解释器会在一定条件下自动补全分号. 类似于(实例一): function myFunction(a) {var num = 10 return a * num ...
- Javascript中的陷阱大集合【译】
参考:http://www.2cto.com/kf/201111/111203.html 昨天晚上在自己的个人技术博客上翻译了一篇有关Javascript的文章,今天想想还是把它投稿到博客园吧,大家可 ...
最新文章
- GPT2文本生成有问题?这里有些潜在解决思路
- 深度丨当AI遇见区块链,2018年的第一场火,还是第一场泡沫?
- 人类智慧的本质是什么?【知社视频】第118期
- 小米Redmi 5G旗舰 K30 Pro,最大亮点:怼华为荣耀
- 如何能在git bash中使用mvn命令_使用Github Actions完成CI/CD工作
- layui的表格可以动态添加行吗_答疑分享052:插入表格,数据分析更方便
- #1117. 编码 ( 字典树版 ) 题解分析
- 变量命名 – 匈利亚命名法则 - C语言零基础入门教程
- oracle或mysql分组查询并且获取前3条排序后的数据
- 【安装包】MySQL客户端
- Spring基于注解管理bean(一文搞懂注解及使用注解)
- 是运用计算机科学的基础知识进行问题求解,计算机基础-第一章计算机基础知识.ppt...
- android吉他谱组件,android手机吉他谱
- word怎样在方框内打勾/打叉 word方框打勾教程
- 由浅入深:自己动手开发模板引擎——解释型模板引擎(一)
- 鸿蒙曰蜉蝣不知所求,【经典金句408 · 庄子】:浮游,不知所求;猖狂,不知所往;游者鞅掌,以观无妄。...
- 硬件防火墙 与软件防火墙
- ipad怎么压缩文件?教你一招快捷压缩图片
- iphone计算机历史信息,“领先业界5年!” 苹果iPhone历史回顾
- 2021计算机系统大作业 CSAPPHello‘s P2P
热门文章
- Win10连不上蓝牙鼠标
- 关键词优化难易程度如何判断?
- 海南三亚旅游吃住行攻略
- 小默应用:用有温度的科技 构建移动资讯平台
- 哪款软件可以将数码相机照片恢复?
- 结合开创函数使用的函数
- php+head+下载,CMSHead 开源的PHPCMS系统下载/CMSHead 开源的PHPCMS系统官方下载-太平洋下载中心...
- 暗黑三php是什么原因,为什么要有鉴定装备的过程——从暗黑3说开去
- 一文搞懂如何使用ArcGIS API for Python训练深度学习模型
- 【开源硬件篇】STM32F103C8T6核心板