块语句
js中最基本的语句是块语句,所谓块语句即用一对大括号括起来的若干语句
{
statement1;
statement2;
statement3;
...
statementN;
}
块语句通常和控制语句一起使用,所谓控制语句即if语句、while语句以及for语句
while (i < 10) {
console.log(i++);
}
在上面这个例子中{ console.log(i++); }
就是一个块语句。请注意,var关键字声明的变量不是块范围的,它只能声明局部范围或者全局范围。
var x = 10;
if (true) {
var x = 20;
}
console.log(x); // 控制台输出20
如果要声明块范围的变量,可以使用let
关键字
let x = 10;
{
let x = 20;
}
console.log(x); // 控制台输出10
const关键字也可以用来声明块范围的常量,这点不做过多赘述
条件语句
js支持两种条件语句,一种是if...else
语句,另一种是switch
语句
if…else语句
像下面这种语句就是if...else
语句
if (条件) {
// 块1
语句1;
} else {
// 块2
语句2;
}
条件可以是变量,也可以是字面量,甚至可以是表达式。如果条件为true,则执行块1中的语句;否则,执行块2中的语句。每个块中都可以有多条语句
请注意,在js中,除undefined、none、空串(“”)、0、NaN外,其他的值被当作条件时都与true等价。而上述5个值则与false等价
if (0) {
console.log("这是一个true值");
} else {
console.log("这是一个false值");
}
if...else
语句还有一种形式,即if...else if... else
,这种形式通常用来按顺序测试多个条件,请注意它在遇到第一个满足条件的情况后执行完其后的语句,就不会再测试剩余的条件,而是会执行条件语句之后的语句。
if (条件1) {
语句1;
} else if (条件2) {
语句2;
} else if (条件3) {
语句3;
} else {
语句4;
}
如果条件1为true,则执行语句1;否则测试条件2,如果条件2为true,则执行语句2;否则测试条件3,如果条件3为true,则执行语句3。如果都不满足,则行语句4。以此类推,最后的else语句块可以省略。另外,条件语句是可以嵌套的,比如下面这个例子
if (条件1) {
if (条件2) {
语句1;
} else {
语句2;
}
}
如果条件1为真,则对条件2进行判断,如果条件2为真,则执行语句1;否则执行语句2
switch语句
一个switch语句如下所示
switch (表达式) {
case 标签1:
语句1;
break;
case 标签2:
语句2;
break;
default:
语句3;
}
switch语句会根据表达式的值去匹配case后面的标签,匹配到立即执行;如果一直没有找到,则会执行default后面的语句。遇到break就立即跳出switch语句,执行switch语句后面的语句。
expression = 1;
switch (expression) {
case 1:
console.log(1);
break;
case 2:
console.log(2);
break;
default:
console.log("default");
}
上面这个例子会在控制台输出1。
请注意,break和default并不是必须的,而是根据可选,在没有break的情况下,switch语句会一直向下执行,直到遇到break语句或者switch语句结束
expression = 1;
switch (expression) {
case 1:
console.log(1); // 在控制台输出1
case 2:
console.log(2); // 在控制台输出2
default:
console.log("default"); // 在控制台输出default
}
上面这个例子每个case和default后面的语句都会执行
异常处理语句
throw语句
使用throw语句可以抛出异常
throw expression;
expression可以是任意类型的值,比如下面这个例子
throw 1;
throw 2;
throw "我是个bug"
通常我们使用throw语句抛出异常对象
throw new Error("我是个异常");
try…catch语句
使用throw语句可以抛出异常,那么该怎么处理异常呢?我们通常使用try...catch
语句
try {
语句;
} catch (err) {
处理语句;
}
使用try将要抛出异常的语句块包裹起来,使用catch语句来定义处理异常的方式。当try块中有语句发生异常时,就会执行catch块中的语句;当try块中没发生异常时,catch块中的语句不会执行。catch后面的括号里面的变量你可以起任何名字,只要符合规范,它是一个Error对象,有name和message属性,name属性是异常对象的名字,message属性封装了异常的描述信息,你可以这样抛出异常
try {
throw new Error("我是个Bug")
} catch (e) {
console.log(e.name); // Error
console.log(e.message); // 我是个bug
}
try...catch
语句还有个可选部分,即finally
语句
try {
语句;
} catch (err) {
处理语句;
} finally {
语句;
}
finally块中的语句无论try块中的语句是否发生异常都会执行
try {
console.log("你好");
} catch (error) {
console.log(error.name);
} finally {
console.log("没有异常,让我们喝杯咖啡放松一下");
}
无论如何,finally中的语句都会执行。
你也可以省略catch块
try {
console.log("你好");
} finally {
console.log("没有异常,让我们喝杯咖啡放松一下");
}
这样也是可以的,但请注意,finally语句会覆盖返回结果或者抛出的异常,也就是说,抛出的异常或者返回值最终以finally为准