9月阅读周·JavaScript权威指南:语法的基础——词法结构,直接量和可选的分号注释篇

举报
叶一一 发表于 2024/09/21 19:05:57 2024/09/21
【摘要】 背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读八个月。已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScri...

背景

去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。

没有计划的阅读,收效甚微。

新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。

这个“玩法”虽然常见且板正,但是有效,已经坚持阅读八个月。

已读完书籍《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》

当前阅读周书籍《JavaScript权威指南》

直接量

所谓直接量(literal),就是程序中直接使用的数据值。下面列出的都是直接量:

  12//数字
  1.2//小数
  "hello world"//字符串文本
  'Hi'//另一个字符串
  true//布尔值
  false//另一个布尔值
  /javascript/gi
  //正则表达式直接量(用做模式匹配)
  null//空

更多复杂的表达方式可以写成数组或对象直接量,例如:

  {x:1,y:2}//对象
  [1,2,3,4,5]//数组

可选的分号

和其他许多编程语言一样,JavaScript使用分号(;)将语句分隔开。许多JavaScript程序员(包括本书中的示例代码)使用分号来明确标记语句的结束,即使在并不完全需要分号的时候也是如此。另一种风格就是,在任何可以省略分号的地方都将其省略,只有在不得不用的时候才使用分号。不管采用哪种编程风格,关于JavaScript中可选分号的问题有几个细节需要注意。

考虑如下代码,因为两条语句用两行书写,第一个分号是可以省略掉的:

  a=3;
  b=4;

如果按照如下格式书写,第一个分号则不能省略掉:

  a=3;b=4;

需要注意的是,JavaScript并不是在所有换行处都填补分号:只有在缺少了分号就无法正确解析代码的时候,JavaScript才会填补分号。换句话讲(类似下面代码中的两处异常),如果当前语句和随后的非空格字符不能当成一个整体来解析的话,JavaScript就在当前语句行结束处填补分号。看一下如下代码:

  var a
  a
  =
  3
  console.log(a)

JavaScript将其解析为:

JavaScript将其解析为

JavaScript给第一行换行处添加了分号,因为如果没有分号,JavaScript就无法解析代码var a a。第二个a可以单独当做一条语句"a;",但JavaScript并没有给第二行结尾填补分号,因为它可以和第三行内容一起解析成“a=3;”。

这些语句的分隔规则会导致一些意想不到的情形,这段代码写成了两行,看起来是两条独立的语句:

  var y=x+f
  (a+b).toString()

但第二行的圆括号却和第一行的f组成了一个函数调用,JavaScript会把这段代码看做:

  var y=x+f(a+b).toString();

而这段代码的本意并不是这样。为了能让上述代码解析为两条不同的语句,必须手动填写行尾的显式分号。

通常来讲,如果一条语句以“(”、“[”、“/”、“+”或“-”开始,那么它极有可能和前一条语句合在一起解析。以“/”、“+”和“-”开始的语句并不常见,而以“(”和“[”开始的语句则非常常见,至少在一些JavaScript编码风格中是很普遍的。有些程序员喜欢保守地在语句前加上一个分号,这样哪怕之前的语句被修改了、分号被误删除了,当前语句还是会正确地解析:

  var x=0//这里省略了分号
  ;[x,x+1,x+2].forEach(console.log)//前面的分号保证了正确地语句解析

如果当前语句和下一行语句无法合并解析,JavaScript则在第一行后填补分号,这是通用规则,但有两个例外。第一个例外是在涉及return、break和continue语句(参见第5章)的场景中。如果这三个关键字后紧跟着换行,JavaScript则会在换行处填补分号。例如,这段代码:

  return
  true;

JavaScript会解析成:

return;true;

而代码的本意是这样:

return true;

也就是说,在return、break和continue和随后的表达式之间不能有换行。如果添加了换行,程序则只有在极特殊的情况下才会报错,而且程序的调试非常不方便。

第二个例外是在涉及“++”和“——”运算符(见4.8节)的时候。这些运算符可以作为表达式的前缀,也可以当做表达式的后缀。如果将其用做后缀表达式,它和表达式应当在同一行。否则,行尾将填补分号,同时“++”或“——”将会作为下一行代码的前缀操作符并与之一起解析,例如,这段代码:

  x
  ++
  y

这段代码将解析为"x;++y",而不是"x++;y"。

总结

JavaScript使用分号(;)将语句分隔开。这对增强代码的可读性和整洁性是非常重要的:缺少分隔符,一条语句的结束就成了下一条语句的开始,反之亦然。在JavaScript中,如果语句各自独占一行,通常可以省略语句之间的分号(程序结尾或右花括号“}”之前的分号也可以省略)。


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。