JavaScript 假如default不是switch的最后一项

开发 前端
switch的逻辑很简单,根据switch内容的值执行对应的case项,否则执行default项即可。但是不同的语言在具体一些细节上面的处理却是不同的。本文主要介绍javascript中的应用,一起来看。

话说大家对于switch语句应该再熟悉不过了,各种类C语言都不例外,JavaScript自然也是如此。switch的逻辑很简单,根据switch内容的值执行对应的case项,否则执行default项即可。但是不同的语言在具体一些细节上面的处理却是不同的。

例如在JavaScript里,每个case项都可以没有break,于是语句便会顺延到下个case或是default里面去——但某些语言设计者认为这种特性容易造成代码理解上的偏差,因此比如在C#里便要求每个case都要有个break。那么再来一个细节问题:如果default之后还有case,那么会出现什么样的情况?如果default里没有break呢?

 

  1. switch (a)   
  2. {  
  3. case 0:  
  4. console.log("0");  
  5. default:  
  6. console.log("default");  
  7. case 1:  
  8. console.log("1");  

 

就好比这段代码,当a等于0、1或2的时候,将会输出什么样的内容呢?先猜猜,别急着往下看。

当a等于0时,则会输出:

  1. 0    
  2. default   

 

当a等于1时,则会输出:

 

 

当a等于2时,则会输出:

     

  1. default   

 

好吧,尽管这样的代码比较罕见,但执行结果也并没有什么“特殊”的。switch的规则依旧可以用一句话说清:如果匹配到某个case,则从该case处开始执行,否则就从default处开始执行,一直向下,直到出现break语句为止。至于default的位置是否在***,对于执行的策略可谓完全没有影响。

当然,我实在没想到为什么有人会写这样的代码,所以假如有人对这点感觉恍惚我也觉得没太大关系。不过既然我要写Jscex,则还是必须对此类代码的行为有所了解。尽管语言的使用者可以选择合适的子集,但语言的开发者(编译器、解释器等等)却必须遵循完整的规范,这是Jscex这类项目需要应对的麻烦。

既然Jscex号称支持“全部JavaScript语言特性”,自然对switch的支持也在包括在内。switch的麻烦之处在于它的每个分支不像if语句那样完全相互独立,而是会不断“穿透”下去直至遇上break。因此Jscex在处理switch的时候也使用了一些技巧。例如下面这段代码:

 

  1. switch (a) {  
  2. case 0:  
  3. $await(helloWorld());  
  4. default:  
  5. console.log("default");  
  6. case 1:  
  7. console.log("1");  

 

Jscex会将每个case及default中的语句“补齐”,以“确保”每项里都有完整的语句以及***的break:

 

  1. switch (a) {  
  2. case 0:  
  3. $await(helloWorld());  
  4. console.log("default");  
  5. console.log("1");  
  6. break;  
  7. default:  
  8. console.log("default");  
  9. console.log("1");  
  10. break;  
  11. case 1:  
  12. console.log("1");  
  13. break;  

 

然后再将其编译为:

 

  1. switch (a) {  
  2. case 0:  
  3. return $$_builder_$$_0.Bind(helloWorld(), function () {  
  4. console.log("default");  
  5. console.log("1");  
  6. return $$_builder_$$_0.Normal();  
  7. });  
  8. default:  
  9. console.log("default");  
  10. console.log("1");  
  11. return $$_builder_$$_0.Normal();  
  12. case 1:  
  13. console.log("1");  
  14. return $$_builder_$$_0.Normal();  
  15. }  
  16. }) 

 

自然,如果switch里没有包含bind操作(例如$await语句),则整个switch语句都会得以保留,这也是Jscex编译结果的优化策略之一。

原文地址:http://blog.zhaojie.me/2011/05/javascript-when-break-is-not-the-last-choice-of-switch.html

【编辑推荐】

  1. 在Java中>、>>、>>>三者的区别
  2. 分享Java连接各种数据库的实例
  3. Java编译器优化方法简介
  4. 常见的十四种Java开发工具的特点
  5. Java中的四个核心技术思想
责任编辑:于铁 来源: 老赵的博客
相关推荐

2023-02-13 23:15:31

ChatGPT聊天机器人人工智能

2021-02-08 23:17:25

IT投资首席信息官

2021-12-28 10:16:59

ITIT领导IT管理

2022-07-11 10:38:24

首席信息官CIO

2009-07-27 14:38:34

网络运维管理奥运

2021-05-10 09:52:35

技术隐私浏览器

2015-10-20 17:13:56

Perforce

2023-04-10 16:09:58

2021-09-09 09:37:23

MySQLGalera数据库

2021-11-15 15:48:22

招聘AI人工智能

2013-02-21 08:35:42

苹果云计算数据中心

2020-02-13 07:20:05

微软Windows 10WonderBar

2015-05-18 10:28:19

AndroidiOS应用

2010-08-02 09:30:49

云计算

2023-12-01 08:00:00

人工智能IT

2016-02-16 10:34:42

Spark大数据数据处理

2021-04-29 22:33:58

Windows 10Windows微软

2020-07-19 15:20:34

程序员技术设计

2012-03-27 10:24:24

Siri

2015-07-14 16:17:56

亚马逊AWSAWS API Gat
点赞
收藏

51CTO技术栈公众号