恶补基本功-JavaScript中的分号

本篇文章参考书籍《JavaScript权威指南》

文章目录

前言

  最近在和一些前辈交流的时候,感觉自己的基础知识不是很全面,很多东西并不能一针见血的指出要害,经济基础决定上层建筑,为了强化自己的知识系统,从本篇文章开始,对基础知识问题来一次全面扫荡,各位兄弟姐妹,欢迎查漏补缺,一起进步。

JS理解的分号

  我们知道 JS 使用( ; )将语句分隔开,这对于增强代码的可读性和整洁性非常重要。

  缺少分隔符,一条语句就成了下一条语句的开始,反之亦然。现在很多格式校验的插件可以提醒我们哪里缺少分号(比如 eslint )。但是我们需要知道有些地方的分号为什么在那里。

  对于分号,一般存在两种流派,一种是处女座型,绝不省略任何一个分号,在每个需要标记的地方上都标记清楚。

  另一种就是能省就省,不到报错提醒,绝不会多加一个分号。

  那我们就看看那些分号可以省,那些省不得。

   JS 中,如果语句独占一行,通常可以省略语句之间的分号(程序结尾或右花括号“ } ”之前的分号也可以省略)。

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

a = 3;
b = 4;

  如果按照如下书写方式,那么第一个分号不能省:

a = 3; b = 4;

  需要注意的是, JS 并不是在所有换行处都填补分号:只有在缺少了分号就无法正常解析代码的时候, JS 才会填补分号,比如如下代码:

var a
a
=
3
console.log(a)

   JS 会将其解析为:

var a; a = 3; console.lg(a);

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

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

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

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

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

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

  通常来讲,如果一条语句以“ ( ”,“ [ ”,“ / ”,“ + ”或“ - ”开始,那么极有可能和前一条语句合在一起解析。以“ / ”,“ + ”,“ - ”开头的语句并不常见,但是以“ ( ”,“ [ ”开始的语句非常常见。

  有些程序员喜欢保守的在语句前增加一个分号,这样哪怕语句被修改,分号被误删除了,当前语句还是能正确地解析:

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

  如果当前语句和下一行语句无法合并解析, JS 则在第一行后填补分号,这是通用规则,但有两个例外。

  第一个例外是在涉及 return break continue 语句的场景中。如果这三个关键字后紧跟着换行, JS 则会在换行处填补分号。例如:

return
true;

   JS 会解析成:

return;true;

  而代码的本意是这样;

return true;

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

  第二个例外是在涉及“ ++ ”和“”运算符的时候。

  这些运算符可以作为表达式的前缀,也可以当做表达式的后缀。如果是用作后缀表达式,它和表达式应当在同一行。否则行尾将添补分号,同时“ ++ ”或“”将会作为下一行代码的前缀操作符并与之一起解析,例如:

x
++
y

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




猜你喜欢

转载自blog.csdn.net/EcbJS/article/details/114625837