复习
JavaScript文法有相当多的微妙之处,我们作为开发者应当比平常多花一点儿时间来关注它。一点儿努力可以帮助你巩固对这个语言更深层次的知识。
语句和表达式在英语中有类似的概念 —— 语句就像句子,而表达式就像短语。表达式可以是纯粹的/自包含的,或者他们可以有副作用。
JavaScript文法层面的语义用法规则(也就是上下文),是在纯粹的语法之上的。例如,用于你程序中不同地方的{ }
可以意味着块儿,object
字面量,(ES6)解构语句,或者(ES6)被命名的函数参数。
JavaScript操作符都有严格定义的优先级(哪一个操作符首先结合)和结合性(多个操作符表达式如何隐含地分组)规则。一旦你学会了这些规则,你就可以自己决定优先级/结合性是否是为了它们自己有利而 过于明确,或者它们是否会对编写更短,更干净的代码有所助益。
ASI(自动分号插入)是一种内建在JS引擎找中的解析器纠错机制,它允许JS引擎在特定的环境下,在需要;
但是被省略了的地方,并且插入可以纠正解析错误时,插入一个;
。有一场争论是关于这种行为是否暗示着大多数;
都是可选的(而且为了更干净的代码可以/应当省略),或者是否它意味着省略它们是在制造JS引擎帮你扫清的错误。
JavaScript有几种类型的错误,但很少有人知道它有两种类别的错误:“早期”(编译器抛出的不可捕获的)和“运行时”(可以try..catch
的)。所有在程序运行之前就使它停止的语法错误都明显是早期错误,但也有一些别的错误。
函数参数值与它们正式声明的命名参数之间有一种有趣的联系。明确地说,如果你不小心,arguments
数组会有一些泄漏抽象行为的坑。尽可能避开arguments
,但如果你必须使用它,那就设法避免同时使用arguments
中带有位置的值槽,和相同参数的命名参数。
附着在try
(或try..catch
)上的finall
在执行处理顺序上提供了一些非常有趣的能力。这些能力中的一些可以很有帮助,但是它也可能制造许多困惑,特别是在与打了标签的块儿组合使用时。像往常一样,为了更好更干净的代码而使用finally
,不是为了显得更聪明或更糊涂。
switch
为if..else if..
语句提供了一个不错的缩写形式,但是要小心许多常见的关于它的简化假设。如果你不小心,会有几个奇怪的地方绊倒你,但是switch
手上也有一些隐藏的高招!