## 语句 表达式在JavaScript中是短语,而语句(`statement`)就是JavaScript整句或命令。 JavaScript语句是以分号结束。 默认情况下,JavaScript解释器依照语句的编写顺序依次执行。 **1. 表达式语句** **(1) 复合语句** 我们可以用花括号将多条语句括起来,这就是复合语句(语句块)。 ``` { var a = 1; var b = 1; } ``` **(2)空语句** 分号前面可以没有任何内容,JavaScript引擎将其视为空语句。 ``` ; ``` 当你使用空语句时,最好加上注释。 **2. 声明语句** `var`和`function`都是声明语句,它们声明或定义变量或函数。 `var`语句用来声明一个或多个变量。 ``` var a = 1; var a =1 ,b=2; ``` 注意:如果`var`语句中的变量没有指定初始化表达式,那么这个变量的初始值为undefined。 关键字`function`是用来定义函数的。 ``` function a(){} ``` **3、条件语句** **(1)if语句** 条件语句是通过判断指定表达式的值来决定执行还是跳过某些语句。 ``` if(expression) { statement; } ``` 其中的expression(条件)可以是任意表达式,而且对这个表达式求值的结果不一定是布尔值。ECMAScript会自动调用Boolean()转换函数将这个表达式的结果转换为一个布尔值。如果对expression求值为true时,则执行statement;如果为false,则跳过。 注意:JavaScript语法规定,if关键字和带圆括号的表达式之后必须跟随一条语句,但可以使用语句块将多条语句合并在一起。 **if..else..** ``` if(expression) { statement1; } else { statement2; } ``` 在JavaScript中,if、else匹配规则是:else总是和就近的if语句匹配。 推荐使用代码块,即使只有一行代码。 **(2)switch** ``` switch(expression) { case "": statement ;break; case "": statement1;break; .... default: statements; break; } ``` 如果表达式等于这个值,则执行后面的语句;break关键字会导致代码执行流跳出switch语句。如果省略break,就会导致执行完当前case后,继续执行下一个case;当`switch`表达式与所有`case`表达式都不匹配时,则执行`default`。 当然,如果你有两个值是执行同一段代码的,可以这样: ``` switch(expression) { case "": case "": statement;break; ..... } ``` 注意:由于对每个case的匹配操作实际是“===”全等运算符比较,而不是“==”相等运算符比较,因此,表达式和case的匹配并不会做任何类型转换。比如字符串"10"不等于数值10. **(3)三元运算符 ? :** JavaScript还有一个三元运算符(即该运算符需要三个运算子)?:,也可以用于逻辑判断。 ``` (contidion) ? expr1 : expr2 ``` 上面代码中,如果contidion为true,则返回expr1的值,否则返回expr2的值。 **4、循环语句** 循环语句就是程序路径的一个回路,可以让一部分代码重复执行。 **(1)while语句** `while`语句属于前测试循环语句,也就是说,在循环体内的代码被执行之前,就会对出口条件求值。因此,循环体内的代码有可能永远不会被执行。 语法: ``` while(expression) { statement } ``` 当expression计算为true时,则执行statement。 注意:使用`while(true)`则会创建一个死循环。 **(2)do...while语句** do...while语句是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。也可以说,在对条件表达式求值之前,循环体内的代码至少会被执行一次。 语法: ``` do { statement } while(expression); ``` do...while循环和while循环非常相似,但是,do...while的循环体至少会执行一次。 **(3)for语句** `for`语句也是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代码的能力 语法: ``` for(initialize ; test ; increment) { statement } ``` initialize、test、increment三个表达式之间用分号隔开,分别负责初始化操作、循环条件判断和计数器变量的更新。 只有test返回true才会进入for循环,因此也有可能不会执行循环体内的代码。 initialize表达式只在循环开始之前执行一次。 注意:即使是循环内部定义的变量,在循环外部也可以访问到它。 for语句中的初始化表达式、控制表达式和循环后表达式都是可选的,如果都省略,就会创建一个无限循环: ``` for(;;){ //无限循环 } ``` **注意:**由于JavaScript没有块级作用域,所以在for里面定义的变量都是全局变量。(ES6会有块级作用域) **(4)for...in语句** `for..in`语句是一种精准的迭代语句,可以用来枚举对象的属性。 语法: ``` for(property in object) { statement } ``` 例子: ``` var o = { name: 'tg', age: 18}; for(var v in o) { console.log(v + ': ' + o[v]); } ``` 注意:ECMAScript对象的属性是没有顺序的,因此通过for...in循环输出的属性名的顺序是不可预测的。 **5. 跳转语句** `break`语句是强制退出循环,然后执行循环后面的语句。 `continue`语句是终止本次循环的执行并开始下一次循环的执行。 JavaScript中的语句可以命名或带有标签(label),`break`和`continue`可以跳转到任意位置,也是在JavaScript中唯一可以使用标签语句的语句。 **6. 标签语句** 语句是可以添加标签的,标签是由语句前的标识符和冒号组成: ``` label : statement ``` label语句定义的标签一般由break或continue语句引用。加标签的语句一般要与for等循环语句配合使用。 ``` var num = 0; tip : for(var i = 0; i < 10; i++){ num += i; console.log(i); // 轮流输出:0、1、2、3、4、5 if(i ==5) { break tip; } } console.log(num); // 15 ``` 当执行到i=5时,会跳出循环,也就是tip对应的层,然后执行其下方的代码。 **7. 其他语句** **(1)return语句** `return`语句只能在函数体内出现,否则报错。当执行到`return`语句时,函数终止执行,`return`后面的代码永远不会被执行。 **(2)throw语句** 异常是指当发生了某种异常情况或错误时产生的一个信号。 ``` throw expression try..catch...finally语句 try{ }catch(e){ }finally{ } ``` **(3)with语句** `with`语句用于临时扩展作用域链,也就是将代码的作用域设置到一个特定的对象中。 ``` with(object){ statement } ``` 将object添加到作用域链的头部,然后执行statement,最后把作用域链恢复到原生状态。 ``` var o = { name: 'tg', age: 24 }; with(o){ console.log('name:' + name); // name:tg console.log('age:' + age); // age:24 } ``` with里面的name相当于o.name。 **注意**:在严格模式中是禁止使用with语句的。 **(4)debugger语句** debugger语句用来产生一个断点(breakpoint),JavaScript代码的执行会停止在断点的位置。一般用来调试代码。 **(5)"use strict"** 使用"use strict"指令的目的是说明后续的代码将会解析成严格代码。