首页
语句2
语句2
版权声明:本文为原创内容,转载请声明出处。
原文地址: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对象所创建出来的了。