走進javascript 解開switch之謎

2021-09-07 09:26:27 字數 2627 閱讀 9238

很早以前就覺得switch很怪異,或者說一直沒太理解它,它怪異就怪異在非要給每個語句加上break;不然後面的語句就算不符合條件還是會執行,比如以下這段**

var num = 2;

switch(num)

執行效果如下

明明只有2才符合條件,但3跟4也被執行了,然後查教程說要加上break,後來**就成了下面這個樣子

var num = 2;

switch(num)

寫過若干個switch語句以後,心裡不由產生一種情緒,switch太tm難用了,明明很簡單,非要讓人多寫乙個break;還不如用if來判斷,不知道這是不是很多人都有的想法,反正在之前我是這麼想的。

寫的**越多,就越覺得這太不對勁了,於是在想,如果每個語句都要寫break;那麼解析器直接幫忙寫上就好了,可現實是,解析器並沒有這麼幹。在某乙個瞬間,產生了乙個想法,這個switch肯定還有我所不知道的東西,於是帶著這種心情在網上各種查,終於在某乙個瞬間,找到了一絲曙光。

不知道你有沒有一種感覺哈,寫switch特別難用,當然這是有前提的,那就是你對switch不了解。說它難用不僅僅只是說每次要加break,在if中,我們判斷某個值如果等於2或者3的時候,我們可以下面這樣寫

var num = 3;

if(num===2||num===3)

但如果要你在switch中實現這樣的乙個功能,可能會令你無從下手。

以上都是瞎說——,因為switch是可以實現這些功能的,之所以我們會覺得不能實現是因為它的這種實現方式,太容易讓人誤解了,並且如果你不往那方面去想,很難發現它的用處。

下面是乙個用switch實現的判斷num===2或===3的例子

var num = 2;

switch(num)

輸出如下

這個case是乙個入口,當某個值相匹配時,就會去執行相應的**塊,並且如果沒有加break的話,後面的值不管是否匹配都會被執行直到遇見break將跳出switch語句,而以上的這段**就是利用的這一點,我們在這裡並沒有給2的值加break;因此當值等於2的時候,還會接著往下執行,但在3中有乙個break,因此執行完3就會被跳出。如果值為3則直接執行3**塊,接著跳出。

也就是說,之前我所認為的怪異,它是合理的,只是這些東西,沒有被我所發現。

如果想在switch中實現判斷,諸如1>2,則可以使用下面的這種方式來實現

在switch中做判斷的時候,需要注意一點,它用的是全等===而非==,比如下面這段**

var num = "1";

switch(num)

它並沒有輸出1,因為在switch中預設使用的是全等,因此它不會進行隱式轉換。

如果你想實現隱式轉換,可以用下面這種方式來實現。

var num = "1";

switch(true)

輸出如下

這個true究竟是個什麼...,這是你的第一反應?

之所以會有這種感覺,是因為我們對switch一直都存在著一些誤解,而且這種誤解很深很深,反正我從學程式設計以來就一直沒有理解這個switch,開始是它才過於基礎,導致很多人都不願意去研究它。

為了解開這個switch之謎,我從重對它做一次講解,用**來講把。

switch(x)
其中的x代表某乙個值,而case中的n如果和x一模一樣則會被執行,注意是一模一樣,舉個例子

(x = 5) 5  (n = x==5) true   因為5!==true所以不會被執行

具體**

var num = 5;

switch(num)

又如

var num = 5;

switch(num)

這裡所說的一模一樣就是說的,num這個值和case上的值要一樣,不是單方面的case為true就為true。

而我們上面給switch傳true就是因為這個原因,因為true是個布林值,所以我們才可以用判斷。

其實switch並沒有限制你要傳什麼,它才不管你傳的是false還是陣列,你case上的值只要和它相對應就ok,最後舉個例子

switch(undefined)
輸出undefined。

雖然這篇文章是在講switch,但我覺得它同時也說明了乙個道理.........自己去悟。

JS 基礎篇之帶你走進JavaScript的函式

函式 function 是一段預定義好,並且可以被反覆使用的 塊。1 普通函式 function 函式名 2 帶參函式 function 函式名 引數列表 3 帶返回值的函式 function 函式名 引數列表 js中允許通過乙個變數來接受呼叫函式後的返回值,如var 變數名 函式名 實參列表 1 ...

程序切換之 switch

linux 核心程序切換最重要的乙個部分就是巨集定義switch to,下面從幾個方面來詳細講解一下 1 內嵌彙編 2 memory 破壞描述符 編譯器優化 3 程序切換的標誌是什麼?4 堆疊切換的標誌是什麼?5 為什麼switch to 提供了三個引數?6 彙編引數的傳遞?帶著這幾個問題,先來大體...

走進Emacs Lisp世界之HelloWorld

乙個簡單emacs lisp的helloworld.message helloworld 隨便開個buffer輸入這段內容然後游標定位到右括號最後c x c e 後再emacs下面就可以顯示helloworld了.再看看怎麼定義個函式來顯示helloworld.defun test message ...