摘要:本文章記錄本人在深入學習條件表達式中看書理解到的一些東西,并且整理記錄下來,加深記憶和方便之后的復習。表達式的值具有線性特征,如對連續的區間值進行判斷。
本文章記錄本人在深入學習js條件表達式中看書理解到的一些東西,并且整理記錄下來,加深記憶和方便之后的復習。主要是深入學習if else和switch語句的一些性能優化和邏輯思維。
提高條件性能的策略js的條件表達式和其他語言一樣,都采用了if else和switch這兩種。由于不同的瀏覽器對流程控制進行了不同的優化。因此這兩種在性能上是沒有什么區別的,主要還是根據需求進行分析和選擇。
如果條件較小的話選用if else比較合適。
相反,條件數量較大的話,就建議選用switch。
一般來說,if else適用于兩個離散的值或者不同的值域。如果判斷多個離散值,使用switch更加合適。
恰當的使用 if 與 switch在大多數的情況下switch比if else運行的更加快。
當我們使用到條件表達式的時候,無論if else還是switch,都應確保下面3個目標的基本實現:
精確表現事物的內在、固有的邏輯關系。不能為了結構而破壞。
優化邏輯的執行效率。執行效率是程序設計的重要目標,不能為了省事而隨意的消耗資源。
簡化代碼的結構層次,使代碼更加容易的閱讀。
適合使用if else的情況:
具有復雜的邏輯關系。
表達式的值具有線性特征,如對連續的區間值進行判斷。
表達式的值是動態的。
測試任意類型的數據。
適合使用switch的情況:
每句表達式的值。這種是可以期望的、平行邏輯關系的。
表達式的值具有離散性,不具有線性的非連續的區間值。
表達式的值是固定的,不是動態變化的。
表達式的值是有限的,而不是無限的,一般情況下表達式應該比較少。
表達式的值一般為整數、字符串類型的數據。
例如,對學生的分數進行不同的判斷,這個時候使用if else就比較合適,因為這種情況,表達式的值是連續的線性判斷。
Javascriptif (socre < 60) { alert("不及格"); } else if (socre > 60 && socre <= 85) { alert("良好"); } else if (socre > 86) { alert("優秀"); }
而判斷性別之類的使用switch就比較合適。
Javascriptswitch (sex) { case "男": alert("先生"); break; case "女": alert("女士"); break; }優化 if 邏輯
邏輯順序體現了人的思維的條理和嚴密性。合理的順序可以提升解決問題的品質,相反,混亂的順序和容易導致各種錯誤的發生。
人們考慮的東西到時候,都會把最可能發生的情況先做好準備。優化if邏輯的時候也可以這樣想:把最可能出現的條件放在前面,把最不可能出現的條件放在后面,這樣程序執行時總會按照帶啊名的先后順序逐一檢測所有的條件,知道發現匹配的條件才會停止繼續檢測。
if的優化目標:最小化找到分支之前所判斷條件體的數量。if優化的方法:將最常見的條件放在首位。
Javascriptif (i < 5) { // 執行一些代碼 } else if (i > 5 && i < 10) { // 執行一些代碼 } else { // 執行一些代碼 }
例如上面這個例子,只有在i值經常出現小于5的時候是最優化的。如果i值經常大于或者等于10的話,那么在進入正確的分支之前,就必須兩次運算條件體,導致表達式的平均運算時間增加。if中的條件體應該總是按照從最大概率到最小概率排列,以保證理論速度最快。
if 嵌套的思維陷阱在if語句里面在嵌套一個if語句是一件經常見到的東西,假設有4個調價你,只有當這些條件都符合要求的時候,才會執行某一些事情。遵循一般人的思維習慣,在檢測這些條件的時候,常常會沿用下面這種結構嵌套:
Javascriptif (a) { if (b) { if (c) { if (d) { alert("條件全部成立"); } else { alert("條件 d 不成立"); } } else { alert("條件 c 不成立"); } } else { alert("條件 b 不成立"); } } else { alert("條件 a 不成立"); }
從思維的方向性來考慮,這種結構并沒有錯,使用下面這種if結構來表示可能更加的合適和簡單:
Javascriptif (a && b && c && d) { alert("全部條件成立"); }
從剛才的代碼來說,使用if語句來逐個驗證條件的合法性,并且對某個條件是否合法進行了提示,方便我們去追蹤每一個條件。但是,如果使用了上面的if結構多重嵌套,就會出現另一種可能:a條件如果不成立的話,就會直接跳出整個嵌套結構,不會去管b,c,d條件是否成立。如果這樣做的話,層層包裹的if結構會使代碼嵌套過深,難以編輯。
為了解決上面的問題,一般來說會采用排除法,即對每一個條件進行排除,條件全部成立在執行特定的操作。
Javascriptvar t = true; if (!a) { t = false; } if (!b) { t = false; } if (!c) { t = false; } if (!d) { t = false; } if (t) { // 條件全部符合要求 }
排除法有效的避免了上面所說的條件結構的多重嵌套問題,且更加符合人的思維模式。當然,也存在一些局限性,一旦發生錯誤的話,就要放棄后面的操作。如果想要防止這類問題發生,可以在設計一個標示變量來跟蹤整個操作行為。
容易在 if 里犯的小錯誤不知道大家有木有犯過下面這種錯誤:
Javascript// 第一種 if (i = 1) { alert(i); } // 第二種 if (i = 1) ; { alert(i); }
第一種情況是,有時候會把比較運算=== or ==符錯寫為賦值運算符=。而且這種錯誤一般很難發現,由于它是一個合法的表達式,不會導致編譯錯誤。
最后就把常量放在左邊,把變量放在右邊,這樣寫的話,就算你把=當作了===來使用也會報錯。
Javascriptif (1 === i) { alert(i); }
第二種是,在if的括號后面加了個分號,導致整個結構的邏輯就發生了變化。我們應該牢記條件表達式之后不允許添加分化,最后就通過把大括號與條件表達式寫在一行來防止犯錯。
Javascriptif (i) { alert(i); }編寫 switch 要注意的地方
千萬不要忘記在每一個case語句后面放一個break語句。也可以放一個return或者throw。case語句匹配expression是用===而不是==。
防止 switch 貫穿在switch語句中,除非明確地中斷流程,否則每次條件判斷后就會貫穿到下一個case條件。在執行switch語句中,js會先計算switch條件的值,然后使用這個值與每個case中的值進行比較,如果相同則執行標簽下的語句。在執行的時候如果遇到跳轉語句,就會跳出switch結構,否則就會按照順序執行下去,知道switch語句末尾。如果沒有匹配的case的話就會執行default的語句。
Javascriptswitch (a = 3) { case 3 - 2: alert(1); break; case 1 + 1: alert(2); break; }
上面的switch語句中,case語句只是指明了想要執行代碼的起點,并沒有指明終點,如果沒有在case從句中添加break語句,則會發生連續貫穿現象,從而忽略后面的case從句,這樣就會造成switch結構的邏輯混亂。
最后,如果文章有什么錯誤和疑問的地方,請指出。與sf各位共勉!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85630.html
摘要:遞歸函數還會受到瀏覽器調用棧的大小的限制。雖然迭代也會導致性能問題,但是使用優化的循環就可以代替長時間運行的遞歸函數,可以提高新能,因為運行一個循環比反復調用一個函數的開銷要小。 本文章記錄本人在深入學習js循環中看書理解到的一些東西,加深記憶和并且整理記錄下來,方便之后的復習。 選擇正確的循環體 在大部分編程語言中,代碼執行的時間多數消耗在循環的執行上。 js定義了4種...
摘要:正則表達式使用單個字符串來描述匹配一系列匹配某個句法規則的字符串。接下來,是在手機正則里面已經出現了。序列匹配而則匹配。分組與反向引用分組,又稱為子表達式。把正則表達式拆分成小表達式。 本文轉載自網絡。轉載編輯過程中,可能有遺漏或錯誤,請以原文為準。原文作者:水墨寒湘原文鏈接:https://juejin.im/post/582dfc... 正則表達式對于我來說一直像黑暗魔法一樣的存...
摘要:等同于等同于其他類型和布爾類型之間的比較如果是布爾類型,則返回的結果。 showImg(https://segmentfault.com/img/bVburFq?w=796&h=398); 前言 JavaScript作為一門弱類型語言,我們在每天的編寫代碼過程中,無時無刻不在應用著值類型轉換,但是很多時候我們只是在單純的寫,并不曾停下腳步去探尋過值類型轉換的內部轉換規則,最近通過閱讀你...
摘要:等同于等同于其他類型和布爾類型之間的比較如果是布爾類型,則返回的結果。 showImg(https://segmentfault.com/img/bVburFq?w=796&h=398); 前言 JavaScript作為一門弱類型語言,我們在每天的編寫代碼過程中,無時無刻不在應用著值類型轉換,但是很多時候我們只是在單純的寫,并不曾停下腳步去探尋過值類型轉換的內部轉換規則,最近通過閱讀你...
摘要:等同于等同于其他類型和布爾類型之間的比較如果是布爾類型,則返回的結果。 showImg(https://segmentfault.com/img/bVburFq?w=796&h=398); 前言 JavaScript作為一門弱類型語言,我們在每天的編寫代碼過程中,無時無刻不在應用著值類型轉換,但是很多時候我們只是在單純的寫,并不曾停下腳步去探尋過值類型轉換的內部轉換規則,最近通過閱讀你...
閱讀 3515·2021-11-15 11:38
閱讀 830·2021-11-08 13:27
閱讀 2243·2021-07-29 14:50
閱讀 2975·2019-08-29 13:06
閱讀 840·2019-08-29 11:22
閱讀 2413·2019-08-29 11:04
閱讀 3505·2019-08-28 18:23
閱讀 894·2019-08-26 13:46