成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

在js開(kāi)發(fā)中,如何減少if else語(yǔ)句的使用

android_c / 2172人閱讀

摘要:第二步盡量少使用如果在函數(shù)中,可以使用,先判斷錯(cuò)誤條件,然后立馬結(jié)束函數(shù),防止進(jìn)入分支。在大多數(shù)情況下,的性能不會(huì)比低。

那么問(wèn)題來(lái)了,在js開(kāi)發(fā)中,如何減少if else語(yǔ)句的使用

代碼中嵌套的if/else結(jié)構(gòu)往往導(dǎo)致代碼不美觀,也不易于理解。面向過(guò)程的開(kāi)發(fā)中代碼有大量的IF ELSE,在java中可以用一些設(shè)計(jì)模式替換掉這些邏輯,那么在js中是否也有類(lèi)似的方法用來(lái)盡可能減少代碼中的if/else嵌套呢?

有人認(rèn)為:if else多就多唄,只要可讀性強(qiáng),維護(hù)起來(lái)方便。jQuery.fn.init里就是一堆if else判斷,難道要質(zhì)疑jQuery作者的水平了?
并不是說(shuō)if else多就不好,關(guān)鍵是看用的地方,jQuery.fn.init里除了if else判斷簡(jiǎn)潔點(diǎn),難道要改成switch?就算用工廠(chǎng)模式,還不是得做大量的if判斷。

代碼整潔強(qiáng)迫癥患者必須要來(lái)個(gè)拋磚引玉:

1.
if(a為真){
    a=a
}else{
    a=b
}

可寫(xiě)成:a = a || b

2.
if(a==b){
    a=c
}else{
    a=d
}

可寫(xiě)成:a = (a==b) ? c : d

3.

后臺(tái)接口通常會(huì)返回這種數(shù)據(jù):
fruit: 0 // 0=蘋(píng)果,1=梨子,2=桔子,3=檸檬,4=芒果...
這時(shí)寫(xiě)if...else是最痛苦的。從沖哥那偷來(lái)個(gè)方法:

var _f = ["蘋(píng)果","梨子","桔子","檸檬","芒果"];
shuiguo = _f[fruit];
建議: 第一步:優(yōu)化if邏輯

人們考慮的東西到時(shí)候,都會(huì)把最可能發(fā)生的情況先做好準(zhǔn)備。優(yōu)化if邏輯的時(shí)候也可以這樣想:把最可能出現(xiàn)的條件放在前面,把最不可能出現(xiàn)的條件放在后面,這樣程序執(zhí)行時(shí)總會(huì)按照帶啊名的先后順序逐一檢測(cè)所有的條件,知道發(fā)現(xiàn)匹配的條件才會(huì)停止繼續(xù)檢測(cè)。

if的優(yōu)化目標(biāo):最小化找到分支之前所判斷條件體的數(shù)量。if優(yōu)化的方法:將最常見(jiàn)的條件放在首位。

if (i < 5) {
    // 執(zhí)行一些代碼
 } else if (i > 5 && i < 10) {
    // 執(zhí)行一些代碼
 } else {
    // 執(zhí)行一些代碼
 }

例如上面這個(gè)例子,只有在i值經(jīng)常出現(xiàn)小于5的時(shí)候是最優(yōu)化的。如果i值經(jīng)常大于或者等于10的話(huà),那么在進(jìn)入正確的分支之前,就必須兩次運(yùn)算條件體,導(dǎo)致表達(dá)式的平均運(yùn)算時(shí)間增加。if中的條件體應(yīng)該總是按照從最大概率到最小概率排列,以保證理論速度最快。

第二步:盡量少使用else

如果在函數(shù)中,可以使用 if + return,先判斷錯(cuò)誤條件,然后立馬結(jié)束函數(shù),防止進(jìn)入 else 分支。

舉個(gè)簡(jiǎn)單的例子,后端返回?cái)?shù)據(jù),前端根據(jù)狀態(tài)進(jìn)行不同操作

$.ajax().done(function (res) {
    if (res.state === "SUCCESS") {
        //TODO
    } else if (res.state === "FAIL") {
        //TODO
    } else {
        //TODO
    }
});

這里用if else不挺好的么,有啥問(wèn)題么?不過(guò)我個(gè)人傾向于switch。

解決方法:

1. switch/case

switch和if else在性能上是沒(méi)有什么區(qū)別的,主要還是根據(jù)需求進(jìn)行分析和選擇。

如果條件較小的話(huà)選用if else比較合適。

相反,條件數(shù)量較大的話(huà),就建議選用switch。

一般來(lái)說(shuō),if else適用于兩個(gè)離散的值或者不同的值域。如果判斷多個(gè)離散值,使用switch更加合適。

在大多數(shù)的情況下switch比if else運(yùn)行的更加快。

在大多數(shù)情況下,switch的性能不會(huì)比if else低。switch的確在實(shí)質(zhì)上跟if else if 完全一樣的效果,不過(guò)在很多情況下,使用switch要比if else方便不少

比如經(jīng)典的值等分支,匹配一些狀態(tài)常量的時(shí)候,比if else結(jié)構(gòu)方便許多,不用反復(fù)寫(xiě)xx == yy

$.ajax().done(function (res) {
    switch (res.state) {
        case "SUCCESS":
            //TODO
            break;
        case "FAIL":
            //TODO
            break;
        default :
            //TODO
    }
});

注意:千萬(wàn)不要忘記在每一個(gè)case語(yǔ)句后面放一個(gè)break語(yǔ)句。也可以放一個(gè)return或者throw。case語(yǔ)句匹配expression是用===而不是==。

2.hash 表
if (key == "Apple") {
    val = "Jobs";
} else if (key == "microsoft"){
    val = "Gates";
} else if (key == "Google"){
    val = "Larry";
} 

這個(gè)也可以用 switch case 解決,不過(guò)推薦的方法是 hash 表:

var ceos = {"Apple":"Jobs", "microsoft":"Gates", "Google":"Larry"};
val = ceos[key];
3.重構(gòu),用 OO 里面的繼承或者組合
1.如果是狗,則汪汪
2.如果是貓,則喵喵
3.如果是羊,則咩咩
4.如果是鴨,則嘎嘎

可以重構(gòu)一下,改成 OO。

*定義類(lèi): 動(dòng)物(或者接口)
*定義方法:叫
*定義子類(lèi):狗、貓、羊、鴨
*重寫(xiě)方法 ----  叫

也就是說(shuō)將同的判斷按照功能,寫(xiě)成函數(shù),這樣也便于閱讀

比如我有一個(gè)方法根據(jù)類(lèi)型獲取名稱(chēng),用if else會(huì)這樣

function getName(type) {
    if (type === "monkey") {
        return "monkey name";
    } else if (type === "cat") {
        return "cat name";
    } else {
        return "dog name";
    }
}

如果寫(xiě)成函數(shù),改成下面的會(huì)更好

function getName(type) {
    var data = {
        monkey: "monkey name",
        cat: "cat name",
        dog: "dog name"
    }

    return data[type] ? data[type] : data["dog"];
}

硬要把設(shè)計(jì)模式添加到JS里不是不可以,但是要看情況。生搬硬套過(guò)來(lái)的東西然并卵啊。
寫(xiě)代碼記住三個(gè)字即可,短簡(jiǎn)易。代碼短,讀起來(lái)簡(jiǎn)單,維護(hù)容易,如果在性能和代碼長(zhǎng)度上二選一,我肯定選代碼短,性能不行,加臺(tái)服務(wù)器就是了。而冗長(zhǎng)的代碼并不是加個(gè)程序員就能搞定的。

保持著這個(gè)心態(tài)寫(xiě)代碼,寫(xiě)出的東西離設(shè)計(jì)模式也不會(huì)差太多了。

多說(shuō)一句:存在必有其價(jià)值,不能說(shuō)if else多了就不好,凡事無(wú)絕對(duì),適合A的未必就適合B,每個(gè)東西都有其實(shí)現(xiàn)的場(chǎng)景。同理改寫(xiě)設(shè)計(jì)模式未必就是最棒的,聽(tīng)起來(lái)高大上點(diǎn)而已。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79090.html

相關(guān)文章

  • 前端開(kāi)發(fā)面試題

    摘要:總結(jié)了一些優(yōu)質(zhì)的前端面試題多數(shù)源于網(wǎng)絡(luò),初學(xué)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí),透徹學(xué)習(xí),形成自己的知識(shí)鏈。如果需要使用,最好是通過(guò)動(dòng)態(tài)給添加屬性值,這樣可以可以繞開(kāi)以上兩個(gè)問(wèn)題。 markyun 總結(jié)了一些優(yōu)質(zhì)的前端面試題(多數(shù)源于網(wǎng)絡(luò)),初學(xué)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí),透徹學(xué)習(xí),形成自己的知識(shí)鏈。萬(wàn)不可投機(jī)取巧,只求面試過(guò)關(guān)是錯(cuò)誤的! sho...

    roland_reed 評(píng)論0 收藏0
  • 前端開(kāi)發(fā)面試題

    摘要:總結(jié)了一些優(yōu)質(zhì)的前端面試題多數(shù)源于網(wǎng)絡(luò),初學(xué)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí),透徹學(xué)習(xí),形成自己的知識(shí)鏈。如果需要使用,最好是通過(guò)動(dòng)態(tài)給添加屬性值,這樣可以可以繞開(kāi)以上兩個(gè)問(wèn)題。 markyun 總結(jié)了一些優(yōu)質(zhì)的前端面試題(多數(shù)源于網(wǎng)絡(luò)),初學(xué)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí),透徹學(xué)習(xí),形成自己的知識(shí)鏈。萬(wàn)不可投機(jī)取巧,只求面試過(guò)關(guān)是錯(cuò)誤的! sho...

    stormgens 評(píng)論0 收藏0
  • 12個(gè)常用javascript簡(jiǎn)寫(xiě)技巧---可以大大減少js代碼量

    摘要:極大的簡(jiǎn)化了代碼量變量聲明盡管會(huì)自動(dòng)講變量上提,使用該方法可以講所有的變量都在函數(shù)的頭部用一行搞定。簡(jiǎn)化前簡(jiǎn)化后譯者譯文原文 微信公眾號(hào) 個(gè)人博客 知乎 本文是并非本人所寫(xiě),只是我看了覺(jué)得對(duì)自己很有幫助,所以分享給大家,原文鏈接在最下面,謝謝觀看。1. 空(null, undefined)驗(yàn)證當(dāng)我們創(chuàng)建了一個(gè)新的變量,我們通常會(huì)去驗(yàn)證該變量的值是否為空(null)或者未定...

    kyanag 評(píng)論0 收藏0
  • webpack優(yōu)化

    摘要:使用要給項(xiàng)目構(gòu)建接入動(dòng)態(tài)鏈接庫(kù)的思想,需要完成以下事情把網(wǎng)頁(yè)依賴(lài)的基礎(chǔ)模塊抽離出來(lái),打包到一個(gè)個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫(kù)中去。接入已經(jīng)內(nèi)置了對(duì)動(dòng)態(tài)鏈接庫(kù)的支持,需要通過(guò)個(gè)內(nèi)置的插件接入,它們分別是插件用于打包出一個(gè)個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫(kù)文件。 webpack優(yōu)化 查看所有文檔頁(yè)面:全棧開(kāi)發(fā),獲取更多信息。原文鏈接:webpack優(yōu)化,原文廣告模態(tài)框遮擋,閱讀體驗(yàn)不好,所以整理成本文,方便查找。 ...

    ChanceWong 評(píng)論0 收藏0
  • webpack4.0優(yōu)化那些事兒

    摘要:配置以何種方式導(dǎo)出庫(kù)。當(dāng)檢測(cè)文件不再發(fā)生變化,會(huì)先緩存起來(lái),等等待一段時(shí)間后之后再通知監(jiān)聽(tīng)者,這個(gè)等待時(shí)間通過(guò)配置。發(fā)布到線(xiàn)上給用戶(hù)使用的運(yùn)行環(huán)境。 一 縮小文件搜索范圍 1 include & exclude 1) action 限制編譯范圍 2) useage module: { rules: [ { test...

    levy9527 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<