成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

2015-10-20 17:13:56

Perforce

2009-07-27 14:38:34

網絡運維管理奧運

2021-05-10 09:52:35

技術隱私瀏覽器

2013-02-21 08:35:42

蘋果云計算數據中心

2021-11-15 15:48:22

招聘AI人工智能

2020-02-13 07:20:05

微軟Windows 10WonderBar

2015-05-18 10:28:19

AndroidiOS應用

2010-08-02 09:30:49

云計算

2021-09-09 09:37:23

MySQLGalera數據庫

2023-04-10 16:09:58

2023-12-01 08:00:00

人工智能IT

2018-06-03 08:48:36

2011-09-05 14:51:23

2016-02-16 10:34:42

Spark大數據數據處理

2020-07-19 15:20:34

程序員技術設計

2021-04-29 22:33:58

Windows 10Windows微軟
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久免费精品国产小说色大师 | 成人夜晚看av | 欧日韩在线观看 | 日本欧美在线观看视频 | 国产真实精品久久二三区 | 在线观看中文字幕 | 午夜在线| 国内精品一区二区 | 一级免费毛片 | 日韩欧美国产精品一区二区 | 精品欧美乱码久久久久久 | 日韩一区二区三区四区五区 | 精品亚洲一区二区三区 | 国产高清视频一区二区 | 久久尤物免费一区二区三区 | 在线视频一区二区三区 | 国产一二区视频 | 国产91视频免费 | 午夜影视大全 | 久久久久久黄 | 中文字幕视频在线观看免费 | 99视频在线免费观看 | 欧美精品一区二区免费 | 欧美精品一区二区三区在线 | av喷水 | 日本在线看片 | 成人亚洲视频 | 国产午夜精品久久久久免费视高清 | 欧美一区二区在线视频 | 欧美精品一区三区 | 国产精品高潮呻吟久久av野狼 | 婷婷不卡| 91精品亚洲 | av国产精品毛片一区二区小说 | 一级毛片播放 | 欧美成人精品 | 成年人在线视频 | 观看av | 国产精品色av | 一区二区三区精品 | 天天天操|