[TOC]
# 语句、表达式和运算符
## 表达式和语句的构成
JavaScript 的源代码本质上是一个语句的集合。语句是由语句和表达式所构成的。表达式则是由表达式和运算符构成的。
可以被分解为保留字、表达式与符号。即使在一条语句中包含其他语句,只要对这条被包含的语句继续进行分解,最终都会变为仅包含保留字、表达式与符号的状态。对于表达式来说,虽然也能在一句表达式中包含其他的表达式,不过只要对所包含的表达式进行分解,最终总是能达到仅包含标识符、字面量与运算符的状态。
## 标识符
命名规则:
- 必须是除保留字以外的单词
- 必须是除true、false、null以外的单词
- 必须是以 Unicode 的(非空)字符开始,之后接有 Unicode 字符或是数字的单词
- 单词的长度并无限制
在实际的编程过程中应遵循:以英文字符、下划线或$开始,之后接有英文字符、下划线、$、数字的单词。习惯上以下划线开始的标识符会被作为“内部标识符”来使用。
## 字面量
在代码中写下这些值之后,将会在运行时直接使用这些值的字面含义。
## 语句
语句(statement)的定义可以由该语言经过明确定义的语法(syntax)规则得到,并且可以在运行程序时执行(execute)语句。
## 代码块(复合语句)
代码块是在大括号({})中所写的语句,以此将多条语句的集合视为一条语句来使用。ECMAScript 中代码块的变量并不存在块级作用域这样的概念。
## if-else 语句
```javascript
if (条件表达式){
语句
}else if (条件表达式){
语句
}else{
语句
}
```
条件表达式的位置所写的式子,将被求值转换为布尔型。
## switch-case 语句
```javascript
switch (语句){
case 表达式1:
语句
break;
case 表达式2:
语句
break;
case 表达式3:
语句
break;
...
default:
语句
break;
}
```
用于跳转目标的作用。可以有多个 case 标签,但是只有一个 default 标签。使用 break 来跳出 switch 语句。
## while 语句
```javascript
while (条件表达式){
语句
}
```
一旦开始执行 while 语句,就先对条件表达式进行求值。如果值为 false,则不会执行循环部分的语句,并结束改 while 语句。如果值为 true,则执行该语句。语句执行完成之后,会再次对条件表达式进行求值。直到值为 false。
以下情况会从 while 循环中退出:
- 保证在循环过程中条件表达式的值将变为 false
- 在循环内部使用 break 语句
- 在循环内部使用 return 语句
- 在循环内部抛出异常
## for 语句
一般被称为 for 循环。
```javascript
for (初始化表达式; 条件表达式; 更新表达式){
语句
}
```
其中的三个表达式都是可以省略的。
在初始化表达式中,通常会写诸如 `i=0` 这样对变量进行初始化的表达式。初始化表达式中对循环变量进行初始化,在更新表达式中对循环变量进行更新,在条件表达式中检查循环变量的值。
## for in 语句
```javascript
for (变量 in 对象表达式){
语句
}
```
in 的左侧是在语句中供赋值的表达式,能够在循环时对其进行操作。in 的右侧是 Object 类型的表达式。
## for each in 语句
```javascript
for each (变量 in 对象表达式){
语句
}
```
for each in 语句并不是把属性名赋值给变量,而是将属性值赋值给他。
```javascript
var obj = {
x: 1,
y: 2,
z: 3
};
for each (var v in obj){
console.log(v) // 1 2 3
}
```
## break 语句
在循环中有时需要中途跳出,可以使用 break 语句。
## continue 语句
在循环中使用 continue 语句,就会跳过在此之后本次循环内尚未执行的语句。
## return 语句
return 语句会中断函数的处理,并将指定的表达式的值作为函数的返回值返回。如果没有指定表达式,函数的返回值将会是 undefined。
## 异常
```javascript
throw 表达式;
try {
语句
} catch(变量名) {
语句
} finally {
语句
}
```
通过 throw 抛出异常,通过 try-catch-finally 捕获异常。finally 始终都会执行。
## in 运算符
in 用于检验属性是否存在的运算符,其运算结果为布尔值。
## instanceof 运算符
instanceof 是一种用于类型判断的运算符,其运算结果为布尔值。
## 三目运算符
```javascript
条件表达式 ? 表达式1 : 表达式2;
```
条件表达式的操作数会首先被求值。得到的值将会转换为布尔型,如果为 true,则对表达式1进行求值。如果为 false,则对表达式2进行求值。
## delete 运算符
用于删除属性的单目运算符。从对象中删除以操作数指定的属性。运算结果为布尔值。如果被删除或属性不存在则为 true,反之为 false