《JavaScript语言精粹》—— 语法篇

导读:我看这本书也已经有好几遍了,每一次都会发现新的大陆,拍手称快!为了更进一步的学习一遍,另外也算是把这本书变成我的手册。把所需要的,好的东西记录在这里,这样以后可以一遍又一遍的回顾。祝我在这条路上走得越来越远。

一、语法

(1) 标识符

标识符是由一个字母开头,其后可以选择性的加上一个或多个字母、数字或者下划线。

保留字是不能被使用的,(这在我写的《深入理解JavaScript》—— Day1里面有写到)。另外本应该作为保留字的undefined、NaN和Infinity也同样的不能使用。但是在对象字面量中的属性名可以使用,但是需要加上引号,并且更糟糕的是不能使用点(.)来访问,只能使用中括号([])来访问该属性名。切记!

var a = {
    'NaN' : 'not a number'
};
console.log(a['NaN']);  // not a number

所以我的建议是不要使用保留字是最好的选择。

注:标识符被用于语句、变量、参数、属性名、运算符和标记。

(2) 数字

JavaScript只有一个数字类型。它是内部被表示为64位的浮点数。但是没有分离出整型类型,所以1和1.0值是相同的。

① 如果数字字面量有指数部分,那么这个字面量的值等于e之前的数字与10的e之后数字的次方相乘。所以100和1e2是相同的。

② 负数可以在前置运算符 - 加数字构成。

③ NaN是一个数值,它表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它自己。你可以用isNaN来检测NaN。

④ Infinity表示所有大于1.79769313486231570e+308的值。

⑤ 数字拥有方法。JavaScript有一个对象Math,它包含一套作用于数字的方法。

(3) 字符串

字符串字面量可以被包在一对单引号或者双引号中它可以包括0个或多个字符。\(反斜杠)是转义字符。JavaScript在被创建的时候,Unicode是一个16位的字符集,所以JavaScript中所有字符都是16位的。

① JavaScript中没有字符类型。要表示一个字符,只需要创建仅包含一个字符的字符串即可。

② 转义字符可以吧那些正常情况下不允许的字符插入到字符串中,比如反斜杠、引号和控制字符。\u 约定用来指定数字字符编码。

“A” === “\u0041”

③ 字符串有一个length属性。例如“seven”的length是5。

④ 字符串是不可变的。一旦被创建,就永远无法改变它。但是你可以通过 + 运算符链接其他字符串来创建一个新的字符串。两个包含相同字符且字符顺序相同的字符串也被认为是true。

'a' + 'm' = 'am';

⑥ 字符串也有一些方法。

(3) 语句

一个编译单元包含一组可执行的语句。在Web浏览器中,每个<script>标签提供一个被编译且立即执行的编译单元。

① 当 var 语句被用在函数内部时,它定义的是这个函数的私有变量。

② switch、while、for和do语句允许有一个可选的前置标签(label),它配合break语句使用。

③ 语句通常按照从上到下的顺序被执行。JavaScript可以通过条件语句、循环语句、强制跳转语句和函数调用来改变执行序列。

④ 代码块是包在一对花括号里面的一组语句。不像其他的语言,JavaScript中的代码块不会创建新的作用域。因此,定义的变量应该被定义在函数的头部,而不是在代码块中。

⑤ if语句根据表达式的值改变程序流程。表达式的值为真时执行跟在其后的的代码块,否则,执行可选的else分支。

⑥ 下面的值被当做假(false):‘’(空字符串)、0、false、 null、undefined、NaN。其他的所有值都是真,其中包括字符串“false”。

⑦ switch语句执行一个多路分支。它把其表达式的值和所有指定的case条件进行匹配。其表达式可能产生一个数字或字符串。当找到一个精确的匹配时,执行匹配的case从句中的语句。如果没有找到任何匹配,那么执行可选的default语句。

其中一个case从句可以包含一个或多个case语句。case表达式不一定必须是常量。要防止继续执行下一个case,那么从句后面应该跟随一个强制跳转语句。你可以用break退出switch语句。

⑧ while语句执行一个简单的循环。如果表达式值为假,就终止循环。表达式为真,那么代码块被执行。

⑨ for语句是一个更加复杂的循环语句。它有两种形式。

第一种: 是由3个可选从句控制:初始化语句、条件从句和增量从句。

第二种: 被称为for-in从句,会枚举一个对象的所有属性名。

⑩ do语句就像while语句,唯一的区别就是它在代码块执行之后而不是之前检测表达式的值。这意味着代码块至少被执行一次。

11. try语句执行一个代码块,并捕获该代码抛出的任何异常。catch从句定义一个新的变量来接收抛出的异常。thorw语句抛出一个异常。如果throw语句在一个try代码块中,那么控制流会跳转到catch语句中。如果throw语句在函数中,则该函数调用被放弃,控制流跳转到调用该函数的try语句的catch从句中。

throw语句中的表达式通常是一个对象字面量,包括一个name属性和一个message属性。异常捕获器可以使用这些信息做些什么。

12. return语句会导致从函数中提前返回。它也可以指定要返回的值。如果没有指定返回值,那么返回undefined。

注:JavaScript中不允许return关键字和表达式之间换行。

13. break语句会使程序退出一个循环语句或switch语句。它可以指定一二可选的标签,那退出的就是带该标签的语句。

注:JavaScript中不允许break关键字和标签之间换行。

(4) 表达式

最简单的表达式就是字面量值(比如字符串或数字)、变量、内置的值、以new开头的调用表达式、以delete开头的属性提取表达式、包在圆括号中的表达式、以一个前置运算符作为前导的表达式。或者表达式后面跟着:

—— 一个中置运算符与另一个表达式(中置运算符是啥?查了半天也查不到,我还是以后看一遍英文原版的吧)

—— 三元运算符?后面跟着一个表达式,然后一个: ,再接着第3个表达式

—— 一个函数调用

—— 一个属性提取表达式

① 运算符优先级

. [] ()提取属性与调用函数
delete new typeof + - !一元运算符
* / %乘法、除法、求余
+ -加法/连接符、减法
>= <= > <不等式运算符
=== !==等式运算符
&&逻辑与
||逻辑或
?:

三元

② typeof的运算值有:number、string、boolean、function、object、undefined。其中null结果是object,这是不对的。我在之前有说过,那么我就不再解释了。

③ 如果!的运算符的值为真,那么产生false,否则产生true。

④ + 运算符可以进行加法运算符或字符串连接。如果你想要的是加法运算,请确保两个运算数都是数字。

⑤ / 运算符可能会产生一个非整数的结果,即使两个运算数都是整数。

⑥ 如果第一个运算数为假,那么&&产生它的第一个运算数的值,否则产生第二个运算数的值。

⑦ 如果第一个运算数为真,那么||产生第一个运算数的值,否则产生第二个运算数的值。

⑧ 函数调用引发函数的执行。函数调用运算符是跟随在函数名后面的一对圆括号。圆括号中可能包含传递给这个函数的参数。

⑨ 一个属性存取表达式用于指定一个对象或数组的属性或元素。

(5) 字面量

① 对象字面量是一种可以方便地按指定规格创建新对象的表示法。属性的名字可以标识符或者字符串。这些名字当做字面量名,所以对象的属性名在编译时才能知道。属性的值就是表达式。

② 数组字面量是一种可以方便按指定规格创建数组的表示法。

(6) 函数

函数字面量定义了函数值。它可以有一个可选的名字,用于递归地调用自己。它可以指定一个参数列表,这些参数就像变量一样,在调用时由传递的实际参数初始化。函数的主体包括变量定义和语句。