JavaScript里的分号,你加还是不加?
1.前言
我们接触的大部分编程语言,都会以 分号 作为代码的结束,将程序语句分隔开来,JavaScript同样如此。这对增强代码的整洁性和可读性是非常重要的。缺乏分隔符,一条语句的结束就变成了另一条语句的开始,反之亦然。在我们初学编程,接触C语言的时候,就常常因为代码结尾没有分隔符或者分隔符写错,而引发程序bug。
对于很多的编程语言,在一条语句结尾加上分号是必须的。然而,对于JavaScript,则并不如此。在JavaScript中,如果语句各自独占一行,通常可以省略语句之间的分号(程序的结尾或者右“}”之前的分号也可以省略。)
因此,在编写JavaScript程序时,一般会有两种编码习惯,加分号 和 不加分号 :
- 加分号: 许多程序员使用分号来明确标记语句的结束,即使在并不完全需要分号的时候也是如此;
- 不加分号: 另一种风格是,在任何可以省略分号的地方,都将其省略,只有在不得不用的时候才使用分号。
下面来记录和讲解一下,JavaScript中使用分号的细节问题。
2.什么情况下可以不加分号
不加分号的情况下,JavaScript在解析时会自动插入分号,在满足以下两个条件的情况下,JavaScript会自动插入分号,可以不加分号:
2.1每条语句各占一行
如果多条语句中每条语句各占一行,则语句结尾的分号可以省略,JavaScript在解析时会自动填补分号,例如:
let x = 10
let y = 20
console.log(x+y) //3
如果写在同一行,则必须要加分号:
let x , y
x = 10 y = 30
console.log(x+y) //SyntaxError: Unexpected identifier
不写分号报错。
2.2 不加分号则上下两行代码无法解析
JavaScript并不是在所有换行的地方都填补分号,只有在缺少了分号就无法正确解析代码的情况下,才会填补分号;
如下示例:
let a
a
=
3
console.log(a) //3
显然,代码被解析为:
let a;
a=3;
console.log(a);
在2行 3行都没有插入分号。
注意:
这些语句的分隔规则会导致一些意想不到的情形,如以下的一个示例;
let m = n + f
(b+c).toString()
但该语句最终会被解析为:
let m = n + f(a+b).toString();
这和源代码表达的意思不合,但这解析下来并不会出错。
3.特殊情况
通俗来讲,如果一条语句以 "(" ,"[" , "/" , "+" , "-" 开始,它们极有可能和前面一条语句一起解析。
如果前一条语句无法和后一条语句合并解析,JavaScript才会在第一条语句后插入分号,这是通用规则。
但是,有2个例外,
3.1 return ,break和continue
如果涉及 return 、break、continue 时,如果这三个关键字后紧跟换行,则该关键字后一定会插入分号;
如:
return
true
一定会被解析成
return;
true;
这显然违背了代码的本意。
3.2 有 ”++“ 或 ”--“运算符时
如果涉及 ”++“ ,”--“运算符的时候,这些表达式可以作为表达式的前缀,也可以作为表达式的后缀。
如果将其作为表达式的后缀的话,它和表达式应该在同一行,否则,JavaScript会在行末添加添加分号,并且 ”++“ "--"会被作为下一句的前缀操作符与下一句一起解析。
如:
x
++
y
这段代码解析为:
x;
++y;
而不是:
x++;y;
4.使用分号的好处
- 加上分号可以避免很多错误(例如,不完整的输入),开发人员可以放心的通过删除多余的空格来压缩代码;
- 加上分号在某些情况下可以增进代码的性能,因为这样解析器就不用花多余的时间去推测在哪里添加分号了。
5.参考文献
- 《JavaScript高级程序设计》
- 《JavaScript权威指南》
6.结语
天气好热,去开个西瓜吃。
- 递归思想解决输出目录下的全部文件
- Linux学习 - 又双叒叕一个软件安装方法
- 在Python中实现你自己的推荐系统
- 在Java中如何实现“Pless presss any key to continue.”
- 震惊小伙伴的Python单行代码
- 如何打造一款可靠的WAF(Web应用防火墙)
- 为啥我的Python这么慢 (一)
- 矩阵的基本知识构造重复矩阵的方法——repmat(xxx,xxx,xxx)构造器的构造方法单位数组的构造方法指定公差的等差数列指定项数的等差数列指定项数的lg等差数列sub2ind()从矩阵索引==》
- 简单的Writer和ReaderWriter的主要方法Writer工作原理Reader的主要方法readLine():String
- 为啥我的Python这么慢 - 项查找 (二)
- 初识字节流+实现缓冲字节流OutputStream的主要方法构造方法读关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回的是Int型而不是
- Properties+重温Map+本地计数器Map方法Properties的方法用Properties的好处
- SequenceInputStreamSequenceInputStream构造方法读关流刷新
- 怎么实现关闭窗口
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java selenium chromedriver浏览器驱动放在哪里?【两种位置】
- 56. Vue原生js的组件拆分结构设计
- 一步一步教你把 Redux Saga 添加到 React&Redux 程序中
- Octave的基本语句及函数的使用入门—ML Note 31
- JAVA的Lock锁接口实现
- 抽象语法树为什么抽象
- burpsuite IP伪造插件
- 用阻塞队列,再系一次鞋带
- I2C总线架构 之 设备驱动
- kail 安装及卸载 docker【亲测可用】
- mac 登录远程服务器(常规ssh+免密快捷方式)
- git常用操作--分支同步master 本地库提交到远程分支
- mac苹果 配置maven settings文件【注意,与win环境不一样!!!】
- mac小程序开发 本地调试 安装 npm modules
- Deeplearning.ai 课程笔记第一部分:神经网络与深度学习