第2章 语法(Grammar)
2.1 空白(Whitespace)
2.2 标识符(Names)
2.3 数字(Numbers)
2.4 字符串(Strings)
2.5 语句(Statements)
2.6 表达式(Expressions)
2.7 字面量(Literals)
2.8 函数(Functions)
本章介绍JS的精华部分的语法,并简要地概述其语言结构
2.1 空白(Whitespace)
空白可能表现为格式化字符或注释的形式。
(1)格式化字符
var that= this; //空白偶尔用来分隔字符系列(var和that之间的空格是不能被移除的)
(2)注释
JS提供两种注释形式:一种是用/* */包围的块注释,另一种是以//为开头的行注释。由于块注释字符对也可能出现在正则表达式上面,所以块注释对于被注释的代码块来说是不安全的。尽量避免使用块注释,推荐使用行注释。
(疑惑:没看出这段关于注释的解释与本节节头所说的空白或表现为注释的形式有何联系)
2.2 标识符(Names)
标识符由一个字母开头,其后可以选择性地加上一个或多个字母、数字或下划线。标识符不能使用保留字。
标识符被用于语句、变量、参数、属性名和标记。
从标识符的英译中Names可以简单地理解为人的名字,java语言中标识符是赋予类、变量或方法的名称。
2.3 数字(Numbers)
(1)JS中只有一个单一的数字类型,它的内部表示为64位的浮点数,和java的double一样。我们需要知道的关于数字的一切就是它是一种数字。
(2)数字字面量指数表达方式:
alert(100==1e2); //true
(3)值NaN是一个数值,它表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它自己。你可以用isNaN(Number)检测NaN。
var test1="300";
var test2="Hello World!";
document.writeln(Number(test1)); //300
document.writeln(Number(test2)); //NaN
(4)值Infinity表示所有大于1.79769313486231570e+308的值
(5)数字拥有方法,JS有一个对象Math,它包含一套作用于数字的方法。
2.4 字符串(Strings)
(1)字符串字面量可以被包围在单引号或双引号中,它可以包含0个或多个字符。JS在被创建时,Unicode是一个16位的字符集,所以JS中的所有字符都是16位的。
(2)JS没有字符类型。要表示单个字符,只需要创建包含一个字符的字符串即可。
(3)转义字符允许把那些政策情况下不被允许的字符插入到字符串中,比如反斜线、引号和控制字符。\u约定允许指定数字表示字符码为。
alert("A"=="\u0041"); //true
(4)字符串有一个length属性。例如:"seven".length是5。
(5)字符串是不可变的。一旦字符串被创建,就永远无法改变它。但通过+运算符去连接字符串从而得到一个新字符串是很容易的。
alert('c'+'a'+'t'==='cat'); //true
(6)字符串有一些方法
'cat'.toUpperCase()==='CAT'
2.5 语句(Statements)
(1)一个编译单元包含一组可执行的语句。在web浏览器中,每个<script>标签都提供一个被编译且立即执行的编译单元。因为缺少链接器,JS把它们抛入一个公共的全局名字空间中。
(2)当var语句被用在函数内部时,它定义了这个函数的私有变量。
(3)switch、while、for和do语句允许一个可选的前置标签(label),它配合break语句来使用。
(4)语句往往按照从上到下的顺序被执行。JS可以通过条件语句(if和switch),循环语句(while、for和do)、强制跳转语句(break、return和throw)和函数调用来改变这个执行序列。
(5)代码块是包在一对花括号中的一组语句。不像许多其他语言,JS中的代码块不会创建一个新的作用域,因此变量应该被定义在函数的顶端,而不是代码块中。
(6)if语句根据表达式的值改变程序的控制流程。下列值被当作假(falsy):①false,②null,③undefined,④空字符串'',⑤数字0,⑥数字NaN;其它的所有值都被当作真,包括true、字符串'false',以及所有对象。
(7)switch语句执行一个多路分支。它把其表达式的值和所有指定的case条件进行匹配。其表达式可能产生一个数字或字符串。当找到精确匹配时执行case从句的语句,如果没有找到任何匹配,则执行可选的default语句;
while语句执行一个简单的循环。如果表达式为假,那么循环终止。表达式为真时,代码块将被执行;
for语句有2种形式:①常见形式由三个可选从句控制:初始化从句,条件从句,增量从句。②另一种形式(被称为for in)会枚举一个对象所有的属性名(或键名)。通常你须通过检测object.hasOwnProperty(variable)来确定这个属性名就是该对象的成员,还是从其原型连中找到的;
for(myvar in obj){
if(obj.hasOwnProperty(myvar)){
...
}
}
do语句就像while语句,唯一的区别是它在代码块执行之后检测表达式的值,这意味着代码块至少执行一次。
(8)try语句执行一个代码块,并捕获该代码抛出的任何异常。catch从句定义了一个新的变量,它接收该异常对象。
throw语句抛出一个异常。如果throw语句在一个try代码块中,那么控制权会跳到catch从句中。如果throw语句在函数中,则该函数调用被放弃,且控制权会跳到调用该函数的try语句的catch从句中。
throw语句中的表达式通常是一个对象字面量,它包含一个name属性和一个message属性。异常捕获器可以使用这些信息去决定该做什么。 (此段内容详见函数一章中的异常)
(9)return语句会使一个函数提前返回。它也可以指定要被返回的值。如果没有指定返回表达式,那么其返回值是undefined。JS不允许在return关键字和表达式之间换行。
break语句会使程退出一个循环语句或switch语句。它可以指定一个可选的标签,那将会使得程序退出该标签的语句。JS不允许在break关键字和标签之间换行。
(10)一个exprssions语句可以给一个或多个变量或成员赋值,或者调用一个方法,或者从对象中删除一个属性。
2.6 表达式(Expressions)
(1)最简单的表达式是字面量值、变量、内置的值、以new前导的调用表达式、以delete前导的属性存取表达式、包括在圆括号中的表达式、以一个前缀运算符作为前导的表达式,或者表达式后面跟着:①一个插入运算符与另一个表达式,②三元运算符?后面跟着另一个表达式,然后接一个:,在然后接第三个表达式,③一个函数调用表达式,④一个属性存取表达式。
(2)运算符的优先级(略)
(3)typeof运算符产生的值有'number','string','object','boolean','undefined','function'。如果运算符是一个数组或者null,那么结果是object;
函数调用引发函数执行。函数调用运算符是跟随在函数名后面的一对圆括号。圆括号中可能包含将会传递给这个函数的参数;
一个属性存取表达式用于指定一个对象或数组的属性元素。
2.7 字面量(Literals)
(1)对象字面量是一种方便指定新对象的表示法。属性名可以是标识符或字符串。这些名字被当作字面量名而不是变量名来对待,所以对象的属性名编译时才知道。属性的值就是表达式。
(2)数组字面量是一个方便指定新数组的表示法。
2.8 函数(Functions)
函数字面量定义了函数的值。它可以有一个可选的名字,用于递归地调用自己。它可以指定一个参数列表,这些参数将作为变量由调用时传递的实际参数初始化。函数的主体包括变量定义和语句。