原文地址:http://www.excelib.com/article/204/show
本节学生接着上节的语句给大家讲解
switch-case-default语句
switch语句用于对指定变量进行分类处理,不同的类型使用case语句进行区分,比如下面的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var grade = "优" ; switch (grade){ case "不及格" : console.log( "低于60分" ); break ; case "及格" : console.log( "60到75分" ); break ; case "良" : console.log( "75到90分" ); break ; case "优" : console.log( "90分(含)以上" ); break ; } |
这里根据不同的等级输出相应分数的范围,等级写在圆括号中,每种类型的值写到case后面,需要注意的是case和值之间有空格分割,值后面有冒号,而且每一个case结束后都要使用break语句跳出,否则会接着执行下一种类型的相应语句。
另外,在switch语句中还经常会使用到default语句,default用于在所有case都不符合条件时执行,default语句放在所有case语句之后,例如下面的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var grade = "良好" ; switch (grade){ case "不及格" : console.log( "低于60分" ); break ; case "及格" : console.log( "60到75分" ); break ; case "良" : console.log( "75到90分" ); break ; case "优" : console.log( "90分(含)以上" ); break ; default : console.log( "没有这种等级" ); } |
上面的代码中grade的值为“良好”,而“良好”在所有的case中都没有,这时就会执行default并打印“没有这种等级”。
switch和if-else语句的区别是switch语句只是对单一的变量进行分类处理,而if-else可以在不同的判断条件中对不同的变量进行判断,if-else语句更加灵活,switch语句更加简单、清晰。
try-catch-finally语句
try语句用于处理异常,其结构如下
try{
正常语句块;
} catch (error) {
异常处理语句块;
} finally {
最后执行语句;
}
当“正常语句块”执行过程中发生错误时就会执行“异常处理语句块”,而无论是否抛出异常都会执行“最后执行语句”。我们看下面的例子
1 2 3 4 5 6 7 8 9 10 11 12 | function getMessage(person){ try { var result = person.name+ "," +person.isEngineer(); } catch (error){ console.log(error.name+ ":" +error.message); result = "处理异常" ; }finally{ return result; } } var msg = getMessage({name: "张三" }); console.log(msg); |
getMessage方法中将传入person的name属性和isEngineer()方法返回值连接到一起并返回,连接过程在try的“正常语句块”中,如果处理过程中遇到异常就会执行catch的“异常处理语句块”,这里的异常处理语句块在控制台打印出了信息并将“处理异常”赋值给返回值,最后在finally语句中将结果返回,无论拼接过程是否发生了异常,最终都会返回result。
在最后我们调用的语句时传入的对象只有name属性而没有isEngineer方法属性,这时执行过程就会抛出异常,进而会执行异常处理语句块,其中会打印异常信息并将“处理异常”赋值给返回值。上面的代码执行结果如下
1 2 | TypeError:person.isEngineer is not a function 处理异常 |
第一行是在异常处理语句块中打印的,第二行是getMessage调用完后最后一句代码打印的。如果在实际使用中,我们应该在捕获到异常后返回事先指定好的一个值,而不是直接返回一个字符串,比如可以为getMessage对象定义一个专门用来表示异常的返回值属性
1 | getMessage.errorMsg= "处理异常" ; |
这样在调用getMessage函数之后就可以使用他来判断是否正确执行了,比如下面的代码
1 2 3 4 5 6 | var msg = getMessage({name: "张三" }); if (msg == getMessage.errorMsg){ // getMessage方法执行异常后的操作 } else { console.log(msg); } |
另外,如果没有必须要执行语句的话也可以省略finally语句块。
throw语句
throw用于主动抛出异常,ES中throw抛出的可以是任何类型,throw抛出的异常可以使用try-catch语句进行捕获,catch捕获到的就是throw所抛出的,比如下面的例子
1 2 3 4 5 6 7 8 9 10 | function add5(n){ if ( typeof n != "number" ) throw "不是数字怎么加" ; return n+5; } try { add5( "a" ); } catch (error){ console.log(error); } |
这里的add5方法的作用是将传入的参数加5后返回,在运算之前先判断所传入的参数是否为数字类型,如果不是则抛出异常,异常信息为“不是数字怎么加”,抛出异常后就不再往下执行了。在调用时因为传入了非数字的“a”,所以会抛出异常,异常的信息可以通过catch来捕获并输出到控制台,代码执行后控制台会打印“不是数字怎么加”。当然,如果想和其他ES异常使用统一的异常处理结构,那么我们所抛出的异常也可以封装为包含name和message属性的对象,比如上面的例子我们可以这么来写
1 2 3 4 5 6 7 8 9 10 | function add5(n){ if ( typeof n != "number" ) throw {name: "类型错误" ,message: "不是数字怎么加" }; return n+5; } try { add5( "a" ); } catch (error){ console.log(error.name+ ":" +error.message); } |
typeof语句
typeof语句的作用是获取变量的类型,调用语法为
typeof 变量
typeof在ES2015中的返回值一共有七种:undefined、function、object、boolean、number、string和symbol,我们看下面的例子
1 2 3 4 5 6 7 8 9 10 11 12 | var a; console.log( typeof undefined); //undefined console.log( typeof a); //undefined console.log( typeof b); //undefined console.log( typeof null ); //object console.log( typeof function (){}); //function console.log( typeof {}); //object console.log( typeof true ); //boolean console.log( typeof 123.7); //number console.log( typeof "str" ); //string console.log( typeof Symbol( "abc" )); //symbol console.log( typeof [1,2,3]); //object |
这里我们特别要注意null和数组的类型都是object,因为null本身也是一个对象,而数组中可以包含其他任何类型的元素,他并不是底层对象,所以他们都没有自己独有的类型。
不过undefined是一种特殊的类型,他所代表的是这么一种类型:他们有名字,但是不知道自己是什么类型。也就是说只要可以叫上名来但是没有赋值的变量都是undefined类型,所以对于我们上面例子中的a和b来说虽然a定义了b没有定义,但是他们都是属于“有名字没值”的变量,所以他们都是undefined类型,如果用我们前面学习过的内存模型来说的话,undefined类型的对象就是只占用一块内存空间(用来保存变量名字)的对象。
另外symbol类型是ES2015中新增的内容,学生会在讲ES2015的时候给大家详细介绍。
instanceof语句
instanceof语句比typeof语句更进了一步,他可以判断一个对象是不是某种类型的实例。就好像我们可以把周围的东西分为动物、植物、空气、水、金属等大的类型,而动物、植物以及金属还可以再进行更细的分类,typeof的作用就是查看一样东西属于什么大的类型,比如动物还是植物什么的,而instanceof可以判断更加具体的类型,比如如果是动物的话可以判断是不是人,如果是人还可以判断是黄种人还是白种人、黑种人等等。instanceof语句的结构为
obj instanceof TypeObject
instanceof语句的返回值为布尔类型,表示我们的判断是否正确。比如下面的例子使用instanceof来判断arr变量是否为数组类型
1 2 | var arr = [1,2,3]; console.log(arr instanceof Array); //true |
我们在后面将会学到function类型的对象可以使用new关键字来创建object类型的对象,那时就可以使用instanceof来判断一个变量是否为指定类型的function对象所创建出来的了。