自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 前端
switch的邏輯很簡單,根據switch內容的值執(zhí)行對應的case項,否則執(zhí)行default項即可。但是不同的語言在具體一些細節(jié)上面的處理卻是不同的。本文主要介紹javascript中的應用,一起來看。

話說大家對于switch語句應該再熟悉不過了,各種類C語言都不例外,JavaScript自然也是如此。switch的邏輯很簡單,根據switch內容的值執(zhí)行對應的case項,否則執(zhí)行default項即可。但是不同的語言在具體一些細節(jié)上面的處理卻是不同的。

例如在JavaScript里,每個case項都可以沒有break,于是語句便會順延到下個case或是default里面去——但某些語言設計者認為這種特性容易造成代碼理解上的偏差,因此比如在C#里便要求每個case都要有個break。那么再來一個細節(jié)問題:如果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   

 

好吧,盡管這樣的代碼比較罕見,但執(zhí)行結果也并沒有什么“特殊”的。switch的規(guī)則依舊可以用一句話說清:如果匹配到某個case,則從該case處開始執(zhí)行,否則就從default處開始執(zhí)行,一直向下,直到出現break語句為止。至于default的位置是否在***,對于執(zhí)行的策略可謂完全沒有影響。

當然,我實在沒想到為什么有人會寫這樣的代碼,所以假如有人對這點感覺恍惚我也覺得沒太大關系。不過既然我要寫Jscex,則還是必須對此類代碼的行為有所了解。盡管語言的使用者可以選擇合適的子集,但語言的開發(fā)者(編譯器、解釋器等等)卻必須遵循完整的規(guī)范,這是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編譯結果的優(yōu)化策略之一。

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

【編輯推薦】

  1. 在Java中>、>>、>>>三者的區(qū)別
  2. 分享Java連接各種數據庫的實例
  3. Java編譯器優(yōu)化方法簡介
  4. 常見的十四種Java開發(fā)工具的特點
  5. Java中的四個核心技術思想
責任編輯:于鐵 來源: 老趙的博客
相關推薦

2023-02-13 23:15:31

ChatGPT聊天機器人人工智能

2021-12-28 10:16:59

ITIT領導IT管理

2021-02-08 23:17:25

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人工智能

2020-02-13 07:20:05

微軟Windows 10WonderBar

2013-02-21 08:35:42

蘋果云計算數據中心

2015-05-18 10:28:19

AndroidiOS應用

2010-08-02 09:30:49

云計算

2023-12-01 08:00:00

人工智能IT

2021-04-29 22:33:58

Windows 10Windows微軟

2020-07-19 15:20:34

程序員技術設計

2016-02-16 10:34:42

Spark大數據數據處理

2021-06-04 09:56:01

JavaScript 前端switch

2015-07-14 16:17:56

亞馬遜AWSAWS API Gat
點贊
收藏

51CTO技術棧公眾號