卸载某乎已经很久了,之前,在那上面看到的文章要么就是抖机灵的,要么就是卖课的,还有就是对一些编程癖好的争论,记得最深刻的一个争论是 vim 好还是 emacs 好。
可能是因为我所处的圈子太 low 了吧,实际工作后,我没有见过一个用 emacs 的。本人作为一名 vim 党,身边碰到的使用 vim 的朋友也是一只手数的过来。我比较好奇,这些争论到底发生在哪里呢?
使用二者并不会高一人等,很多大佬都有自己喜好的开发习惯。我只是想通过我观察到的现实说明,关心 vim 好还是 emacs 好的人可能非常少。但是个人觉得,vim 还是必学的,只有学会它,才能真正帮我们打开命令行的大门,并且它还是很好学的,只要忍受几天的煎熬就行了。
我猜想,大家是不是对编程语言方面的癖好更关心一点呢?于是乎,就有了今天的文章。
对于 JavaScript 这门语言来说,它是如此的灵活,以至于能有很多个人癖好,可能大家知道,我们写一行语句都可以分好几派:有人更喜欢优先用 const
,有人更喜欢优先用 let
;有些人喜欢写分号,有些人不喜欢写分号。
刚工作的时候,年轻气盛,我就和同事因为写不写分号争论起来了,我自始至终都是坚定的不写分号党,我的理由很奇葩:少写分号可以少敲击一次键盘,一天下来可以少敲击几百上千次,少敲击键盘对程序员的手有好处。我同事的的理由是比较普遍的看法:写分号更利于维护,不写分号可能会出现意想不到的问题,但是关于会造成什么意想不到的问题,他也没有说清楚。最后的结果是他赢了。
不过,后面我没有听他的建议,转变为写分号的人,而是查了一下不写分号会有那些坑,继续不写分号。事实上,我们需要注意的点很少,也很好记。个人感觉,不写分号的代码清爽了很多,我们只需要记很少的点,就能获得清爽感,何乐而不为呢?
今天就来分享一下,如何安全的不写分号。
在 JS 中,如果我们一个完整的语句没有写分号,它可以自动帮我们加分号,那怎么确定在哪里加分号呢?大家可能认为是换行就会给我们加分号,我们可以先看下面一个示例:
let a
a
=
1
console.log(a)
但是,它实际会被这样加上分号,不知道有没有出乎你的意料:
let a; a = 1; console.log(a);
我们的一段 JS 代码会被空格分成了很多个 token。当 JS 进行解析的时候,它确实是会在换行处加分号,但不是每个换行处都加,它只有在不加分号语法会出错的时候才加。如果我们组合上下一行的代码的 token 已经不可能构成一个合法的语句了,那就会在当前行的末尾加一个分号。
于是乎,我们上面那个例子,let a
后面加了分号,而紧接着的三行组成了一个语句,console 是最后一个语句。
也正是因为这个规则,在 JS 中不写分号才隐藏这一些坑,比如下面这个例子:
let x = 1 + foo
(a+b).toString()
按照上面的规则说,它实际会被转成:
let x = 1 + foo(a+b).toString();
这肯定不是我们想要的,和 (
会产生类似效果的操作符还有这几个: [
、/
、+
、-
。
对于这种情况我们一般是怎么解决呢?
我们会在这几个操作符开头的语句前面加一个 ;
:
let x = 1 + foo
;(a+b).toString()
尤大作为一个不写分号党,也是这么干的:)
就这一点坑,其实很好记吧?
上面我们说,不是每一个换行都加分号,而是在不加分号语法会出错的时候才加。但是这么说不太准确,有几个流程控制作用关键词是例外,他们分别是:return
、throw
、 yield
、break
、 continue
。包含这些关键词的语句,肯定会在当前行加一个分号,比如说:
return
true
实际上是:
return; true;
另外,在 JS 中还有一些自运算符,比如 ++
、--
,在换行的时候也有些问题,我们可以写:
++
a
上面的写法是没有任何问题了,但是当我们把操作符放到后面,像下面这样:
a
++
就不行了,会有语法错误,不过正常情况下,同学们应该不会这么写。
最后就是我们的箭头函数了,我们箭头函数的 ()
和 =>
是不能分开在两行的。
()
=>
不过,正常人没人这么写吧?(无奈脸)
上面就是做一个不写分号党需要注意的地方,总结一下,我们只需要特别注意一下 (
[
、/
、+
、-
这些操作符开头的语句,除此之外,其他的都会是语法错误,在开发环境下就能表现出来,比较好发现。
有没有觉得,不写分号也没那么罪恶,没那么不好吧。
还有不喜欢写分号同学吗?
今天撸铁两个小时,码字一个小时,稍微有点累,要先去休息了,米娜桑,周末愉快,晚安!