Javascript,到底要不要写分号?

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

 要不要加分号?

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

为什么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.hqwc.cn/news/412052.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决方案|镭速赋能影视行业数字化,电影高速分发技术打造一流传输体验!

中国电影产业链主要分为三部分,即上游制片,中游宣发,下游院线影院,互联网产业发展后衍生出线上票务平台作为产业终端。随着4K、3D、高帧率、高动态范围、广色域、沉浸式音频等新兴视听技术的发展与应用,高新技术格式电…

stm32内存分配博客笔记

原文: stm32内存分配 笔记: 1、向量表与代码段;根据Cortex-M3权威指南描述,系统复位后,在向量表异常0处保存的是堆栈起始地址,而后紧跟中断向量表 2、可以从链接脚本.ld文件中看到终端向量表第一个被链接…

Date,SimpleDateFormate类和Calendar类

目录 一、Date 二、SimleDateFormate类 作用 练习一 练习二 三、Calendar类 概述 Calendar小结 一、Date 构造方法说明public Date()创建Date对象,表示一个时间public Date(long date)创建Date对象,表示指定时间public void setTime(long time)设置…

服务器变矿机,该如何应对?

开始 恶意的挖矿程序会导致服务器cpu的异常占用&#xff0c;很让人讨厌。起初&#xff0c;我只是使用top命令显示出占用cpu不正常的进程&#xff0c;发现其中一个进程占用了百分之九十九点几&#xff0c;然后通过kill -9 <PID>命令干掉它。但总是过不了几天&#xff0c;…

VRPSolverEasy:支持VRP问题快速建模的精确算法Python包

文章目录 前言一步步安装免费版主要模块介绍1. depot point2. customer point3. links4. vehicle type VRPTW 算例数据说明模型建立输出求解状态及结果 前言 VRPSolverEasy 是用于车辆路径问题&#xff08;VRP&#xff09;的最先进的分支切割和定价算法求解器1&#xff0c;它的…

[二]rtmp服务器搭建

[二]rtmp服务器搭建 一.测试二.使用Nginx搭建自己的rtmp服务器1.nginx是什么&#xff1f;2.环境准备 三、搭建过程1.安装编译 nginx 所需要的库2.下载 nginx-1.21.6.tar.gz3.下载 nginx-rtmp-module 4.解压5.编译6.启动nginx&#xff0c;检测nginx是否能成功运行7.配置nginx使用…

易飞ERP抛转钉钉签核,并自动审核易飞单据

支持易飞ERP所有单据送签到钉钉 &#xff08;v: rainholy&#xff09; 1、钉钉界面 2、易飞ERP单据配置 3、钉钉审批完后&#xff0c;自动审核易飞ERP单据

66.Go从零搭建一个orm框架【简版】

文章目录 一&#xff1a;前置学习1、 为什么要用orm2、Golang里面是如何原生连接MySQL的3、ORM框架构想 二: 开始造1、连接Connect2、设置/读取表名Table/GetTable3、新增/替换Insert/Replace4、条件Where5、条件OrWhere6、删除Delete7、修改Update8、查询9、设置查询字段Field…

AVL树 -- C++实现

AVL树 – C实现 1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1…

模具制造企业ERP系统有哪些?企业怎么选型适配的软件

模具的生产管理过程比较繁琐&#xff0c;涵盖接单报价、车间排期、班组负荷评估、库存盘点、材料采购、供应商选择、工艺流转、品质检验等诸多环节。 有些采用传统管理手段的模具制造企业存在各业务数据传递不畅、信息滞后、不能及时掌握订单和车间生产情况&#xff0c;难以对…

压力测试+接口测试(工具jmeter)

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因 为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是…

Jenkins持续集成项目搭建与实践

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 Jenkins简介 Jenkins是Java编写的非常流行的持续集成…