最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS中switch的四種寫法示例

 更新時間:2022年07月14日 11:00:29   作者:邊城  
這篇文章主要為大家介紹了JS中switch的四種寫法示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

JavaScript 的 switch 有四樣寫法,你知道么?不管你知道不知道,反正我是不知道。

我所知道的 JavaScript 的 switch 語句只有一種寫法。但要說到對分支的處理,寫法可就多了去了。if 分支寫法可以算一種,switch 分支寫法可以算第二種,第三種是使用策略模式,如果要把條件運算符也算上的話,嗯,剛好四種。

switch一般寫法

不過本文的主角是 switch。大家都了解 switch 的寫法一般來說是 switch 變量或表達式,case 常量。嗯,比如說,一個百分制成績,90 及 90 分以上算優(yōu)秀,80 及以上 90 以下算良好,60 及以上 80 以下算合格,60 以下為不合格,用 switch 大概會這么寫:

function calcGrade(score) {
    const line = score / 10 | 0;
    switch (line) {
        case 10: case 9:
            return "優(yōu)秀";
        case 8:
            return "良好";
        case 7: case 6:
            return "合格";
        default:
            return "不合格";
    }
}

 代碼中 score / 10 | 0 和 Math.floor(score / 10) 是一樣的效果,就是除以 10 取商的整數(shù)部分。

這段 switch 用得中規(guī)中矩,用取整的辦法來避免使用一長串 if ... else 分支也算是取了巧。

但是現(xiàn)在規(guī)則改了,將合格和良好的分隔點從 80 分降到 75 分,該怎么辦?

按上面取整的辦法依然可以,不過這次除數(shù)不再是 10,而是 5。相應(yīng)地,case 也多了很多:

  • 18、19、20 是優(yōu)秀
  • 15、16、17 是良好
  • 12、13、14 是合格
  • 剩下的是不合格

寫 9 個 case,真不如用 if ... else 算了。

switch簡單寫法

是嗎?其實用 switch 也有簡單一些的寫法:

function calcGrade(score) {
    switch (true) {
        case score >= 90:
            return "優(yōu)秀";
        case score >= 75:
            return "良好";
        case score >= 60:
            return "合格";
        default:
            return "不合格";
    }
}

是不是感覺有些奇怪?這完全不是習(xí)慣了的 switch 表達式 case 常量,而是正好相反,switch 常量 case 表達式!如果你拿這段程序去跑一下,會發(fā)現(xiàn)一點問題都沒有。因為——switch 和 case 是按 === 來匹配的,它并不在乎是表達式還是常量,或者說,switch 和 case 后面都可以接表達式!

是的,表達式!

所以上面那個示例中,把 switch(true) 改成 switch( 2 > 1) 也是一樣的效果。

好啦,腦洞已開。switch 到底有多少種寫法已經(jīng)不重要了。接下來要研究的是 switch 的變種 。

IIFE 封裝

看到 C# 有 switch 表達式,眼饞,能實現(xiàn)嗎?

不用眼饞,JavaScript 里一切都可以是表達式 …… 如果不是,用 IIFE 封裝一個就是了

function calcGrade(score) {
    return (value => {
        switch (true) {
            case value >= 90:
                return "優(yōu)秀";
            case value >= 75:
                return "良好";
            case value >= 60:
                return "合格";
            default:
                return "不合格";
        }
    })(score);
}

注意這里把 score 作為 IIFE 的參數(shù),是因為在實際使用中,可能需要傳入的是一個表達式。這種情況下應(yīng)該提前求值,而且只求一次(避免替在的副作用)。

封成策略

不過這樣的封裝顯然沒什么意義,如果真要這樣封裝,不如封成策略:

function calcGrade(score) {
    return ((value, rules) => rules.find(({ t }) => t(value)).v)(
        score,
        [
            { t: n => n >= 90, v: "優(yōu)秀" },
            { t: n => n >= 75, v: "良好" },
            { t: n => n >= 60, v: "合格" },
            { t: () => true, v: "不合格" },
        ]
    );
}

每項策略都是一個含有 tester (t) 和值 (v) 的對象。tester 是一個判斷函數(shù),傳入需要判斷的值,也就是 switch (表達式) 這里表達式,而這個表達式也是提前求值之后作為 IIFE 的參數(shù)傳入的。應(yīng)用策略的過程簡單粗暴,就是找到第一個符合條件的策略,把它的值取出來。

當(dāng)然這樣用策略有點大材小用。真正需要用策略的情況,策略中通常不是一個值,而是一個行為,也就函數(shù)。

我們知道在 switch 語句中,各個 case 之間是在同一個作用域內(nèi),所以不能在兩個 case 語句中聲明同一個局部變量。雖然用 { } 包裹可以解決這些問題,但代碼看起來不怎么好看,特別是還要注意不要忘了 break。如果用策略的話,看起來可能會順眼一眼,也不用擔(dān)心 break 的問題:

這里為了演示,在策略行為中將先輸出成績,再返回等級。

function calcGrade(score) {
    return ((value, rules) => rules.find(({ t }) => t(value)).fn(value))(
        score,
        [
            {
                t: n => n >= 90,
                fn: score => {
                    const grade = "優(yōu)秀";
                    console.log(grade, score);
                    return grade;
                }
            },
            {
                t: n => n >= 75,
                fn: score => {
                    const grade = "良好";
                    console.log(grade, score);
                    return grade;
                }
            },
            {
                t: n => n >= 60,
                fn: score => {
                    const grade = "合格";
                    console.log(grade, score);
                    return grade;
                }
            },
            {
                t: () => true,
                fn: score => {
                    const grade = "不合格";
                    console.log(grade, score);
                    return grade;
                }
            },
        ]
    );
}

代碼確實有點長,因為有策略行為邏輯在里面。如果真的是要當(dāng)作 switch 表達式來用的話,策略部分應(yīng)該是一個表達式,不會太長的。上面的代碼中,策略行為相似,可以封裝成一個函數(shù),這樣就能寫成表達式的形式了:

function calcGrade(score) {
    const printGrade = (grade, score) => {
        console.log(grade, score);
        return grade;
    };
    return ((value, rules) => rules.find(({ t }) => t(value)).fn(value))(
        score,
        [
            { t: n => n >= 90, fn: score => printGrade("優(yōu)秀", score) },
            { t: n => n >= 75, fn: score => printGrade("良好", score) },
            { t: n => n >= 60, fn: score => printGrade("合格", score) },
            { t: () => true, fn: score => printGrade("不合格", score) },
        ]
    );
}

現(xiàn)在看起來是不是像樣了?

上面的代碼形式各異,干的事情都差不多,也沒有誰優(yōu)誰劣的比較。看得順眼怎么都優(yōu)雅,看不順眼怎么都不受寵。在不同的情況下,選用合適的做法就好。上面的代碼使用的 find() 來查找策略,如果改用 filter(),那又會是另一番景象了。

以上就是JS中switch的四種寫法示例的詳細內(nèi)容,更多關(guān)于JS switch寫法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JS中==與===操作符的比較

    JS中==與===操作符的比較

    js判斷兩個變量是否相等的一些操作符的比較。
    2009-03-03
  • JavaScript 無符號右移運算符

    JavaScript 無符號右移運算符

    無符號右移運算符 (>>>)是右移表達式的位,不保留符號。
    2009-04-04
  • 淺析js綁定事件的常用方法

    淺析js綁定事件的常用方法

    下面小編就為大家?guī)硪黄獪\析js綁定事件的常用方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • js call方法詳細介紹(js 的繼承)

    js call方法詳細介紹(js 的繼承)

    這篇文章主要介紹了js call方法使用方法,有需要的朋友可以參考一下
    2013-11-11
  • 詳解JavaScript閉包問題

    詳解JavaScript閉包問題

    這篇文章主要介紹了詳解JavaScript閉包問題,通過案例一步步進行講解了該項技術(shù)問題,講述了變量的作用域,閉包的概念和作用,需要的朋友可以參考下
    2021-06-06
  • JavaScript入門之事件、cookie、定時等

    JavaScript入門之事件、cookie、定時等

    本文從上一篇文章結(jié)束的地方開始,解釋其他的一些基本的JavaScript語言概念,繼續(xù)為初學(xué)者提供對語言的基礎(chǔ)理解
    2011-10-10
  • 在JavaScript中使用對數(shù)Math.log()方法的教程

    在JavaScript中使用對數(shù)Math.log()方法的教程

    這篇文章主要介紹了在JavaScript中使用對數(shù)Math.log()方法的教程,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06
  • 關(guān)于JS中的閉包淺談

    關(guān)于JS中的閉包淺談

    閉包是一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數(shù)),因而這些變量也是該表達式的一部分
    2013-08-08
  • 淺談js閉包理解

    淺談js閉包理解

    這篇文章主要介紹了js閉包理解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 使用按鈕控制以何種方式打開新窗口的屬性介紹

    使用按鈕控制以何種方式打開新窗口的屬性介紹

    在用戶體驗過程中可能會出現(xiàn)這樣的情況:自定義打開新窗口的樣式,本文將介紹詳細的解決方法,需要了解的朋友可以參考下
    2012-12-12

最新評論

深圳市| 绵竹市| 蒙阴县| 张家川| 罗田县| 平江县| 上犹县| 乌兰察布市| 易门县| 巴彦县| 四子王旗| 莱阳市| 大丰市| 浏阳市| 广东省| 乡宁县| 兴仁县| 娱乐| 稻城县| 天峨县| 广灵县| 盐津县| 黔南| 湘潭县| 屏边| 财经| 云龙县| 苍南县| 山阳县| 荣昌县| 淮安市| 古蔺县| 安吉县| 朝阳市| 密山市| 长垣县| 宜城市| 泸溪县| 永善县| 卢龙县| 定远县|