第二章 语法(Grammer)
1、空白(Whitespace)
空白可能表现为被格式化的字符或注释的形式。
空白通常没有意义,但是有时候必须要用它来分隔字符序列,否则它们就会被合并成一个字符。
// var 和 that之间的空格是不能移除的,但是其它的空格都可以移除。
var that = this;
JS 的两种注释方式:(建议使用// 代替 / / )
方式一:包围的块注释(避免使用) /* */
eg:
/*
var rm_a = /a*/.matth(s);
*/
方式二:行注释 //
2、标识符(Names)
1、标识符是由一个字母开头,其后可选择性地加上一个或多个字母、数字或下划线。
2、标识符不能使用保留字。
3、标识符被用于语句、变量、参数、属性名、运算符和标记。
3、数字(Numbers)
1、JS 只有一个数字类型。它在内部被表示为 64 位的浮点数,和 Java 的 double 数字类型一样。
与其它大多数的编程语言不同的是,他没有分离出整数类型,所以 1 和 1.0 的值相同。
2、如果一个数字字面量有指数部分,那么这个字面量的值等于 e 之前的数字与 10 的 e 之后数字的次方相乘。
所以 100 和 1e2 是相同的数字。
3、负数可以用前置运算符 - 加数字构成。
4、NaN 是一个数值,他表示一个不能产生正常结果的运算结果。NaN 不等于任何值,包括它自己。
可以用函数 isNaN(number)监测 NaN。
Infinity 表示所有大于 1.79769313486231570+308 的值。
4、字符串(Strings)
1、字符串字面量可以被包在一对单引号或双引号中,他可能包含 0 或多个字符。
\(反斜线符号)是转义字符。JS 在被创建的时候,Unicode 是一个 16 位的字符集,所以 JS 中所有字符都是 16 位的。
2、JS 没有字符类型。要表示一个字符,只需要创建仅包含一个字符的字符串即可。
3、转义字符用来把那些正常情况下不被允许的字符插入到字符串中,比如反斜线、引号和控制字符。
\u 约定用来指定数字字符编码。
"A" === "\u0041";
字符串是不可变的。一旦字符串被创建,就永远无法改变它。但是可以通过 + 运算符连接其他字符串来创建一个新字符串。
两个包含着完全相同的字符且字符顺序也相同的字符串被认为是相同的字符串。
"c" + "a" + "t" === "cat"; //true
字符串有一些方法:
"cat".toUpperCase() === "cat"; //true
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 的代码块不会创建新的作用域,因此变量应该被定义在函数的头部,而不是代码块中。
if 语句
1、if 语句根据表达式的值改变程序流程。表达式的值为真时执行跟在其后的代码块,否则,执行可选的 else 分支。
2、下面列出的值被当做假(false)
- false
- null
- undefined
- 空字符串 ''
- 数字 0
- 数字 NaN
其他所有的值都被当做真,包括 true、字符串"false",以及所有的对象。
switch 语句
1、switch 语句执行一个多路分支。他把其表达式的值和所有指定的 case 条件进行匹配。其表达式可能产生一个数字和字符串。当找到一个精确的匹配时,执行匹配的 case 从句中的语句。如果没有找到任何匹配,则执行可选的 default 语句。
2、一个 case 从句包含一个或多个 case 表达式。case 表达式不一定必须是常量。要防止继续执行下一个 case,case 从句后应该跟随一个强制跳转语句。你可以用 break 语句退出 switch 语句。
while 语句
while 语句执行一个简单的循环。如果表达式值为假,就终止循环。而当表达式值为真时,代码块被执行。
for 语句
for 语句是一个结构更复杂的循环语句。它有两种形式:
形式一:
由 3 个可选从句控制:初始化从句(initialization),条件从句(condition),和增量从句(increment)。
首先执行 condition,它的作用通常是初始化循环变量。接着,计算 condition 的值。
典型的情况是它根据一个完成条件检测循环变量。如果 condition 被省略掉,则假定返回的条件为真。
如果 condition 的值为假,那么循环将终止。否则,执行代码块,然后执行 increment,接着循环会重复执行 condition。
形式二:
另一种形式(被称为 for in 语句)会枚举一个对象的所有属性名(或键名)。
在每次循环中,object 的下一个属性名字符串被赋值给 variable。
通常需要检测 object.hasOwnProperty(variable)来确定这个属性名是该对象的成员,还是来自于原型链。
for(myvar in ibj){
if(obj.hasOwnProperty(myvar))
// ...
}
}
do while 语句
do 语句就像 while 语句,唯一的区别是它在代码块执行之后而不是之前检测表达式的值。
这就意味着代码块至少要执行一次。
try catch 语句
try 语句执行一个代码块,并捕获该代码块抛出的任何异常。catch 从句定义一个新的变量variable 来接收抛出的异常对象。
throw 语句
throw 语句抛出一个异常。如果 throw 语句在一个 try 代码块中,那么控制流会跳转到 catch 从句中。如果 throw 语句在函数中,则该函数调用被放弃,控制流跳转到调用该函数的 try 语句的 catch 从句中。
return 语句
return 语句会导致从函数中提前返回。他也可以指定要被返回的值。如果没有指定返回表达式,那么返回值是 undefined。
break 语句
break 语句回事程序退出一个循环语句或 switch 语句。他可以制定一个可选的标签,那退出的就是带该标签的语句。
JS 不允许在 break 关键字和标签之间换行。
expression 语句
expression 语句可以给一个或多个变量或成员赋值,或者调用一个方法,或者从对象中删除一个属性。运算符 = 被用于赋值,不要把它和恒运算符 === 混淆起来。运算符 += 可以用于假发运算或连接字符串。
6、表达式(Expressions)
最简单的表达式是字面量值(比如字符串或数字)、变量、内置的值(true、false、null、undefined、NaN 和 Infinity)、以 new 开头的调用表达式、以 delete 开头的属性提取表达式、包在圆括号中的表达式、以一个前置运算符作为前导的表达式,或者表达式后面跟着:
- 一个中置运算符与一个表达式
- 三元运算符 ? 后面跟着另一个表达式,然后接一个 : 再然后接第 3 个表达式
- 一个函数调用
- 一个属性提取表达式
三元运算符 ? 有 3 个远算数。如果第 1 个运算数值为真,产生第 2 个运算数的值。但如果第 1 个运算数值为假,则产生第 3 个运算数的值。
7、运算符优先级,越上面优先级越高。
// . [] () 提取属性与调用函数
// delete new typeof + - ! 一元运算符
// * / % 乘法、除法、求余
// + - 加法/连接、除法
// >= <= > < 不等式运算符
// === !== 等式运算分
// && 逻辑与
// || 逻辑或
// ?: 三元
a). 圆括号可以忽略优先级排序,优先处理括号内表达式
2 + 3 * 5 === 17;
(2 + 3) * 5 === 25;
b). typeof运算符
产生的值有‘number’、‘string’、‘boolean’、‘undefined’、‘function’和‘object’。
如果运算数是一个数组或 null,那么结果是‘object’。
c). 如果 ! 的运算数的值为真,那么产生 false,否则产生 true。
d). 运算符 + 可以进行加法运算或字符串连接。如果为加法运算,需确保 2 个运算数都是数字,不然会转化为字符串相加,最后得到一个字符串。
e). 除法运算符(/ )可能会产生非整数结构,即使 2 个运算符都是整数
f). and 运算符(&&)在其前运算数的值为假,则产生其前运算数的值,否则产生后运算数的值。
g). or 运算符(||)在其前运算数的值为真,则产生其前运算数的值,否则产生后运算数的值。
h). 函数调用引发函数的执行。函数调用运算符是跟随在函数名后面的一对圆括号。圆括号中可能包含传递给这函数的参数。形式如:fn(arg);。
i). 一个属性取表达式用于指定一个对象或数组的属性或元素。
8、字面量(Literals)
1、对象字面量是一种可以方便地按指定规格创建新对象的表示法。属性名可以是标识符或字符串。这些名字被当做字面量名而不是变量名来对待,所以对象的属性名在编译时才能知道。属性值就是表达式。
2、数组字面量是一种可以方便地按指定规格创建新数组的表示法。
9、函数(Functions)
1、函数字面量定义了函数值。它可以有一个可选的名字,用于递归调用自己。它可以指定一个参数列表,这些参数就像变量一样,在调用时由传递的实际参数(argument)初始化。
2、函数的主体包括变量定义和语句。