Javascript,到底要不要写分号?

news2024/11/28 3:36:08

小白随机在互联网上乱丢一些赛博垃圾,还望拨冗批评斧正。

 要不要加分号?

        先说结论:“不引起程序出错的前提下,加不加都可以,按自身习惯来。” 

为什么JS可以不加分号?

         实际上,行尾使用分号的风格来自于Java,也来自于C和C++,这一设计最初是为了降低编译器的工作负担。

        但是,从今天的角度来看,行尾使用分号,其实是一种语法噪音,恰好JavaScript语言有提供了相对可用的分号自动补全规则,所以,很多JavaScript程序员都是倾向于不加分号的。

        由于我是一个大二的萌新,此前只接触过C语言,所以个人编码习惯还是会在能加分号的地方都加上分号,目前为止这种编码习惯没有带来过什么麻烦。那么,为什么JS不像C语言一样非要老老实实加分号呢?

自动插入分号规则

自动插入分号规则独立于所有的语法产生式定义,规则有三条:

有换行符,且下一个符号是不符合语法的,那么就尝试插入分号。
有换行符,且语法中规定此处不能有换行符,那么就自动插入分号。
源代码结束处,不能形成完整的脚本或者模块结构,那么就自动插入换行符。

这样描述是比较难以理解的,我们一起看一些实际的例子进行分析。

let a = 1
void function(a){
	console.info(a);
}(a)

在这个例子中,第一行结尾处有换行符,接下来 void 关键字接在 1 之后是不合法的,这里命中了我们的第一条规则,因此会在 void 前插入换行符。

var a = 1,b = 1, c = 1;
a
++
b
++
c

这也是个著名的例子,我们看到第二行的a之后,有换行符,后面遇到了++运算符,a后面跟++是合法的语法,但是事实上,在编译的时候,这里的 a 的后面会插入一个分号。所以这段代码最终的结果,b 和 c 都变成了2,而 a 还是1,引发了错误。那么,什么情况下JS不加分号会出错呢?

什么情况下不加分号会出错

1. 小括号开头的前一条语句

想说的一点是,为什么匿名函数前面要加分号;

假设:如果不加分号,程序最终编译成这样子:

var a = 4 
console.log(a)(function () {...}

结果就会报错:Uncaught TypeError: console.log(...) is not a function

Why?

那是因为匿名函数是以括号()为开头,对于程序括号()代表函数执行,那前面应该就有函数名,编译后空格去掉就console.log(a)(...),自然报错。

这也是为什么JS语句后要加分号的原因。

那我不想在每条语句(console.log(a))后都加分号怎么办?

就需要在匿名函数前加分号,后面不加就前面加。

再来一条例子看看:这就是小括号开头的前一条语句要加分号。(匿名函数)

2. 中方括号开头的前一条语句

当然,解决方法就是在行首加分号。

3. 以 "(" ,"[" , "/" , "+" , "-" 开始的语句

以 "(" ,"[" , "/" , "+" , "-" 开始的语句,极有可能和前面一条语句一起解析。

如果前一条语句无法和后一条语句合并解析,JavaScript才会在第一条语句后插入分号,这是通用规则。

但是,有2个例外,

3.1 return ,break和continue

如果涉及 return 、break、continue 时,如果这三个关键字后紧跟换行,则该关键字后一定会插入分号;

return true

一定会被解析成

return; true;

这显然违背了代码的本意。

3.2 有 ”++“ 或 ”--“运算符时

如果涉及 ”++“ ,”--“运算符的时候,这些表达式可以作为表达式的前缀,也可以作为表达式的后缀。

如果将其作为表达式的后缀的话,它和表达式应该在同一行,否则,JavaScript会在行末添加添加分号,并且 ”++“ "--"会被作为下一句的前缀操作符与下一句一起解析。

x

++

y

这段代码解析为:

x; ++y;

看完这么多,我还是决定继续老老实实地给JS加分号了。。。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习记录--归—化输入特征

归化 归化输入(normalizing inputs),对特征值进行一定的处理,可以加速神经网络训练速度 步骤 零均值化 通过x值更新让均值稳定在零附近,即为零均值化 归化方差 适当减小变量方差 解释 归化可以让原本狭长的数据图像变得规整,梯度下降的…

JavaScript基础(27)_内联样式的获取和修改、获取元素当前显示的样式

内联样式的获取和修改 获取元素的内联样式: 语法:元素.style.样式名 注意:通过style属性设置和读取的都是内联样式,无法读取样式表中的样式。 修改元素的内联样式: 语法:元素.style.样式名 样式值比如…

Apache JMeter 3.1压力测试监控服务器数据(cpu、内存、磁盘io等)

Apache JMeter 3.1压力测试 Apache JMeter 3.1压力测试监控cpu、内存情况1.下载Apache JMeter 3.11.1 添加线程组1.2 添加http请求1.3 增加http请求头设置1.4 添加csv配置1.5 添加测试结果监控配置 2. 监控插件下载3. 服务端插件下载并启动3.1 下载3.2 解压并启动3.3 增加服务器…

136基于matlab的自适应滤波算法的通信系统中微弱信号检测程序

基于matlab的自适应滤波算法的通信系统中微弱信号检测程序,周期信号加入随机噪声,进行滤波,输出滤波信号,程序已调通,可直接运行。 136 matlab自适应滤波算法LMS (xiaohongshu.com)

提高支撑座效率的重要性

自动化机械设备在运行过程中需要消耗大量的能源和资源,提高效率意味着更有效地利用这些资源,降低运行成本,而支撑座作为自动化机械设备中重要的传动元件,提高支撑座的效率对于自动化机械设备的可持续发展和企业的竞争力具有重要意…

2024华数杯国际赛A题B题思路及代码!

大家好,这里是本次华数杯国际数学建模竞赛的AB题思路代码讲解贴。 关于思路,可以移步我的视频讲解: 2024华数杯国际赛数学建模选题建议及初步思路!_哔哩哔哩_bilibili 本篇主要讲解代码。 问题A:日本放射性废水 对…

Springboot+vue的智能家居系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的智能家居系统(有报告),Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的智能家居系统,采用M(model&a…

二叉树的概念|满二叉树与完全二叉树|二叉树的性质|二叉树的存储结构

前言 在数据结构中树的用途其实并不大,用得更多的其实是二叉树。所以在本章我们将详细讲解二叉树。 一、二叉树的概念及结构 1、概念 一颗二叉树是结点的一个有限集合,该集合: 或者为空或者由一个根节点加上两颗(互不相交&…

云计算入门——Linux 命令行入门

云计算入门——Linux 命令行入门 前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 介绍 如今,我们许多人都熟悉计算机(台式机和笔记本电…

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络 SUSE Linux Enterprise Server是企业级Linux系统,适合企业应用。该文档适用于在VMware workstation平台安装SUSE Linux Enterprise Server虚拟机。 1.安装准备 1.1安装平台 Windows…

嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

文章目录 一:GPIO输入输出原理二:GPIO基本结构三:GPIO位结构四:GPIO的八种模式道友:相信别人,更要一百倍地相信自己。 (推荐先看文章:《 嵌入式-32单片机-GPIO推挽输出和开漏输出》…

docker安装elk(Elasticsearch+logstash+kibana)

1. 安装Docker 如果您还没有安装Docker,请先安装Docker。您可以按照官方文档进行安装:https://docs.docker.com/engine/installation/ 安装 docker-ce [rootk8s-master ~]# yum install docker-ce -y [rootk8s-master ~]# systemctl start docker &am…

力扣● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

● 435. 无重叠区间 跟弓箭题一样的原理:先集体对左边界排序,然后从第1个区间开始,当下一个区间的左边界比该区间的右边界要小的时候,就得去掉这个区间(count),然后应该①直接更新该区间的右边…

Java根据模板文件生成excel文件,同时将excel文件转换成图片

需求 需要将指定数据导出成表格样式的图片&#xff0c;如图 业务拆解 定义一个导出模板将得到的数据填入模板中&#xff0c;生成excel文件将ecxel文件转换成png格式的图片 代码实现 需要引入的依赖 <dependency><groupId>cn.hutool</groupId><artif…

架构篇04-复杂度来源:高性能

文章目录 单机复杂度集群的复杂度小结 从本篇开始&#xff0c;我们一起深入分析架构设计复杂度的 6 个来源&#xff0c;先来聊聊复杂度的来源之一高性能。 对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机再到集…

难道说 IT行业的下一个风口是鸿蒙开发吗?

按往年的习俗&#xff0c;在年底之季有很多HC都会缩减&#xff0c;尤其当下各种裁员的情况下&#xff0c;不管你是在哪个传统开发行业&#xff0c; 如&#xff1a;C/C、Java、前端、后端……等多少都会一股互联网寒流的影响。而今年却出现了一个怪现象&#xff0c;有个岗位在这…

AI客服发展现状与展望:期待技术进步带来更优质的服务体验

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;越来越多的企业开始采用AI客服&#xff0c;以提高效率、降低成本。然而&#xff0c;一些用户反映AI客服存在回答不准确、难以理解个性化问题等问题&#xff0c;引发了对智能客服发展现状的关注。 在北京市民邹女士的…

网页设计(六)表格与表格页面布局

一、设计《TF43: 前端的发展与未来》日程表 《TF43: 前端的发展与未来》日程表 文字素材&#xff1a; 前端是互联网技术的重要一环&#xff0c;自上世纪80年代万维网技术创立以来&#xff0c;Web成就了大量成功的商业公司&#xff0c;也诞生了诸多优秀的技术解决方案。因其标…

SimMIM: a Simple Framework for Masked Image Modeling

论文名称&#xff1a;SimMIM: a Simple Framework for Masked Image Modeling 发表时间&#xff1a;CVPR2022 开源地址&#xff1a; 开源代码 作者及组织&#xff1a;Zhenda Xie, Zheng Zhang, Hu Han等&#xff0c;来自清华&#xff0c;微软亚洲研究院。 前言 本文提出一种新…

2024-01-17复盘和总结

今日复盘 今天是我失业的第一天&#xff0c;心里有点难受&#xff0c;但是没办法&#xff0c;生活需要继续。 1.做了什么&#xff1f; 今天早上9点出发&#xff0c;骑电动车去了闵行区的图书馆&#xff0c;在图书馆里优化了简历&#xff0c;把word版的简历变成了pdf版的简历…