iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >JavaScript语句后面分号问题的示例分析
  • 123
分享到

JavaScript语句后面分号问题的示例分析

2024-04-02 19:04:59 123人浏览 八月长安
摘要

这篇文章主要为大家展示了“javascript语句后面分号问题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript语句后面分号问题的示例

这篇文章主要为大家展示了“javascript语句后面分号问题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript语句后面分号问题的示例分析”这篇文章吧。

JavaScript自动加分号规则,有3条

  1. 当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。

  2. 当有}时,如果缺少分号,会补分号

  3. 当程序源代码结束时,如果缺少分号,会补分号。 

利用我自己的js语法分析工具JSinJS(https://GitHub.com/kissjs/JSinJS ),我求出了所有能够出现在语句第一个的JS语法标记 (就是Statement的first集合),他们是:

["debugger", "try", "throw", "switch", "Identifier", "with", "return", "break", "continue", "for", "while", "do", "if", "new", "function", "(", "{", "[", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "this", "!", "~", "-", "+", "--", "++", "typeof", "void", "delete", ";", "var"]

共计35个。 

我又求出了所有可以出现在分号之前的语法标记(即去掉分号以后的last集),他们是

["--", "++", "IdentifierName", "]", ")", "}", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "Identifier", "this", "debugger", "return", "break", "continue"]

共计17个。

35*17 = 595种组合,为了方便记忆,以下我分组来讨论语法歧义 。(本来用excel弄了张表,不过表太大了不好贴出来)

首先,以下语法标记开头的语句是绝对安全的,不会跟不加分号的上一行产生任何歧义:

var if do while for continue break return with switch throw try debugger ;

接下来我们来分组看不加分号导致的语法歧义:

  1. 第一种是++和--两种运算符出现在上一行结尾的情况,下一行以以下开头时,会产生语法歧义: 

  2. function delete void typeof new null true false NumericLiteral StringLiteral RegularExpressionLiteral ( [ { Identifier ++ -- + - ~ ! 

  3. 其中,function和delete是非常常用的statement开头。

  4. 特别是 ++和--单独被断为一行的时候,因为JS的语法规则规定后自增运算不允许中间插入换行,所以++和--会被视为前自增而跟下一行连接在一起。

  5. 第二种是return作为上一行结尾的情况,下一行以以下开头时,会产生语法歧义:

  6. function delete void typeof ( [ { Identifier ++ -- + - ~ !

  7. 同样因为JS语法的规则不允许在return 和后面的值之间插入换行,所以return之后只要有换行符就会视为有分号,这常常会与使用者的期望不符合。

  8. 第三种是下一行以+和-开头的情况,上一行以以下结尾是,会产生语法歧义:

  9. -- ++ IdentifierName ] ) } RegularExpressionLiteral

  10. 因为很少有语句以+或者-开头,所以这种情况不算危险。

  11. 第四种是上一行以break、continue结尾的情况,下一行以Identifier开头时,会产生语法歧义。

  12. 第五种是下一行以(和[开头的情况,上一行以以下结尾是,会产生语法歧义:

  13. -- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this 

  14. 这种情况非常危险(所以hax的文章中要提出这种情况应该语句前写分号),几乎上一行的所有情况都将导致正常期望之外的结果。

  15. 第六种是,当下一行以RegularExpressionLiteral 开头的情况,上一行的以下结尾,会导致/被理解为除号:

  16. -- ++ IdentifierName ] ) }  RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this

总结,

  1. 在return、break、continue、后自增、后自减五种语句中,换行符可以完全替代分号的作用。

  2. var if do while for continue break return with switch throw try debugger几种关键字开头的语句,以及空语句,上一行加不加分号影响不大。

  3. 凡表达式语句和函数表达式语句,后面不加分号非常危险,情况极其复杂。

  4. 凡(和[开头的语句,前面不加分号极度危险。

下面在通过实例代码介绍下JavaScript中的分号问题

一般在比较懒的前台程序员中经常会碰到一些莫名其妙的问题。

今天仅讨论一下在JS中经常会碰到一些关于分号的问题。JavaScript这门语言是可以省略分号的,是因为它会换行符后如果缺少分号就会无法编译时它会默认添加上分号,但是在一些特定情况下他是不会默认添加分号的。现在简单介绍一下需要注意的几个地方。

在这种情况时:

var x = 0
[x+1,x+2,x+3].forEach(function(){
console.log(x)
})

这种情况下会导致程序无法正常运行。JavaScript在解析这段代码是并不会在var x = 0后换行。
在写代码时如果以一条语句以 ”(”  ,"[" ,"+" ,"-"  ,"/"  开始时通常在上一条语句不会默认添加分号的。所以在这种情况下尽量保持一下这种写法,在以这些字符开始时在行首添加一个分号,这样可以保证在别人更改上面代码时不加分号也不会影响以下代码运行。

var x = 0
;[x+1,x+2,x+3].forEach(function(){
console.log(x)
})

还有就是在涉及 return   break   continue  这种语句时尽量不要换行

return 
true;
JavaScript会解析为
return; true;
在涉及  ++  和  --  这一系列运算时 在作为表达式的前缀或后缀时在换行是会有一定的问题,如下情况:
var x = 0;
var y = 0;
x
++
y

JavaScript会解析为

x;++y;      而不是    x++;y;

虽然在JavaScript这门语言中  “;”  是可以省略不写的,但是还是建议大家每句代码后都跟上  “;”  养成这种良好的编码习惯,毕竟在大多语言中不带  “;”  的编码适不适用的。

以上是“JavaScript语句后面分号问题的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网html频道!

--结束END--

本文标题: JavaScript语句后面分号问题的示例分析

本文链接: https://www.lsjlt.com/news/76413.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript语句后面分号问题的示例分析
    这篇文章主要为大家展示了“JavaScript语句后面分号问题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript语句后面分号问题的示例...
    99+
    2024-04-02
  • JavaScript语句实例分析
    这篇“JavaScript语句实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav...
    99+
    2024-04-02
  • JavaScript函数定义语句的示例分析
    小编给大家分享一下JavaScript函数定义语句的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!函数定义语句我们现在来...
    99+
    2024-04-02
  • Node.js面试问题的示例分析
    这篇文章主要介绍了Node.js面试问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是error-first的回调方式Err...
    99+
    2024-04-02
  • 生产SQL语句突然变慢问题的示例分析
    这篇文章主要为大家展示了“生产SQL语句突然变慢问题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“生产SQL语句突然变慢问题的示例分析”这篇文章吧。 ...
    99+
    2024-04-02
  • javascript语法的示例分析
    这篇文章将为大家详细讲解有关javascript语法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 JavaScript语法是一套规...
    99+
    2024-04-02
  • JavaScript中this指向问题的示例分析
    这篇文章将为大家详细讲解有关JavaScript中this指向问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 箭头函数箭头函数排在第一个是因为它的 this 不会被改变,所以只要当前函数...
    99+
    2023-06-14
  • javascript流程控制语句集合的示例分析
    这篇文章将为大家详细讲解有关javascript流程控制语句集合的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、if语句   &...
    99+
    2024-04-02
  • mysqldump问题的示例分析
    mysqldump问题的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。导出:mysqldump数据库[表]>/t...
    99+
    2024-04-02
  • php中continue语句的示例分析
    这篇文章主要介绍php中continue语句的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于...
    99+
    2023-06-14
  • mysql中update语句的示例分析
    这篇文章主要介绍了mysql中update语句的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1,准备创建一张test表CREATE...
    99+
    2024-04-02
  • python控制语句的示例分析
    这篇文章主要为大家展示了“python控制语句的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python控制语句的示例分析”这篇文章吧。1、Python为迭代提供了标准的while语句...
    99+
    2023-06-20
  • MySQL中DML语句的示例分析
    这篇文章将为大家详细讲解有关MySQL中DML语句的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。DML操作是指对数据库中表记录的操作,主要包括表记录的插入(in...
    99+
    2024-04-02
  • ES6单条语句的示例分析
    小编给大家分享一下ES6单条语句的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!单条语句ES6时代,操作数组的语句将会更...
    99+
    2024-04-02
  • PHP中INCLUDE语句的示例分析
    这篇文章主要介绍了PHP中INCLUDE语句的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。每次遇到INCLUDE时PHP INCLUDE语句就包含指定的文件。所以你...
    99+
    2023-06-17
  • git多账号登录问题的示例分析
    这篇文章给大家分享的是有关git多账号登录问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。同一服务器,同一托管平台,多个账号问题1、添加key我们暂且以oschina为例。为了更好的说明问题,我们在o...
    99+
    2023-06-09
  • MySQL语句加锁的示例分析
    这篇文章主要介绍了MySQL语句加锁的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。事前准备建立一个存储三国英雄的hero表:CRE...
    99+
    2024-04-02
  • PHP5面向对象的问题的示例分析
    这期内容当中小编将会给大家带来有关PHP5面向对象的问题的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。大家也许对PHP5面向对象已经不再陌生,虽然对一些问题的反映虽然加强了很多,但还有很多东西比...
    99+
    2023-06-17
  • JavaScript内存与性能问题的示例分析
    这篇文章将为大家详细讲解有关JavaScript内存与性能问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、何为JavaScript内存与性能因为事件处理程...
    99+
    2024-04-02
  • PHP面试题的示例分析
    这篇文章主要介绍了PHP面试题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一 、PHP基础部分PHP语言的一大优势是跨平台,什么是跨平台?PHP的运行环境最优搭配...
    99+
    2023-06-15
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作