<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        在ES5與ES6環(huán)境下處理函數(shù)默認(rèn)參數(shù)的實現(xiàn)方法

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:14:48
        文檔

        在ES5與ES6環(huán)境下處理函數(shù)默認(rèn)參數(shù)的實現(xiàn)方法

        在ES5與ES6環(huán)境下處理函數(shù)默認(rèn)參數(shù)的實現(xiàn)方法:函數(shù)默認(rèn)值是一個很提高魯棒性的東西(就是讓程序更健壯) MDN關(guān)于函數(shù)默認(rèn)參數(shù)的描述:函數(shù)默認(rèn)參數(shù)允許在沒有值或undefined被傳入時使用默認(rèn)形參。 ES5 使用邏輯或來實現(xiàn) 眾所周知,在ES5版本中,并沒有提供的直接方法供我們我們處理函數(shù)默認(rèn)值 所以只
        推薦度:
        導(dǎo)讀在ES5與ES6環(huán)境下處理函數(shù)默認(rèn)參數(shù)的實現(xiàn)方法:函數(shù)默認(rèn)值是一個很提高魯棒性的東西(就是讓程序更健壯) MDN關(guān)于函數(shù)默認(rèn)參數(shù)的描述:函數(shù)默認(rèn)參數(shù)允許在沒有值或undefined被傳入時使用默認(rèn)形參。 ES5 使用邏輯或來實現(xiàn) 眾所周知,在ES5版本中,并沒有提供的直接方法供我們我們處理函數(shù)默認(rèn)值 所以只

        函數(shù)默認(rèn)值是一個很提高魯棒性的東西(就是讓程序更健壯)

        MDN關(guān)于函數(shù)默認(rèn)參數(shù)的描述:函數(shù)默認(rèn)參數(shù)允許在沒有值或undefined被傳入時使用默認(rèn)形參。

        ES5

        使用邏輯或||來實現(xiàn)

        眾所周知,在ES5版本中,并沒有提供的直接方法供我們我們處理函數(shù)默認(rèn)值
        所以只能夠自己去增強(qiáng)函數(shù)的功能,一般會這么來做:

        function doSomething (name, age) {
         name = name || 'default name'
         age = age || 18
         console.log(name, age)
        }

        我們將函數(shù)的兩個參數(shù)name與age進(jìn)行默認(rèn)值的處理,如果沒有則使用默認(rèn)值。

        在執(zhí)行一下函數(shù)后,好像并沒有什么不對:

        doSomething() // default name, 18
        doSomething('Niko') // Niko , 18
        doSomething(, 12) // default name, 12

        然而當(dāng)我們執(zhí)行這樣的代碼時,就會獲得一些超出預(yù)期的結(jié)果:

        doSomething('Niko', 0) // Niko, 18

        能夠發(fā)現(xiàn),對于參數(shù)0,我們上邊的默認(rèn)參數(shù)實現(xiàn)方法是有問題的

        就像下邊的四個表達(dá)式,都會輸出wrong,這很顯然不能夠滿足上邊MDN關(guān)于函數(shù)默認(rèn)參數(shù)的定義:

        console.log(0 || 'wrong')
        console.log('' || 'wrong')
        console.log(null || 'wrong')
        console.log(false || 'wrong')

        正確的姿勢

        所以,在ES5中正確的默認(rèn)值處理應(yīng)該是這樣:

        function doSomething (name, age) {
         if (name === undefined) {
         name = 'default name'
         }
         if (age === undefined) {
         age = 18
         }
         console.log(name, age)
        }

        使用三元運算符簡化操作

        或者我們簡寫成三元運算符形式的:

        function doSomething (name, age) {
         name = name === undefined ? 'default name' : name
         age = age === undefined ? 18 : age
         console.log(name, age)
        }

        使用函數(shù)進(jìn)行封裝

        但是如果我們每寫一個函數(shù),都要重復(fù)的去做這些操作
        未免太麻煩了,所以,我們對這個邏輯進(jìn)行一個簡單的封裝:

        function defaultValue (val, defaultVal) {
         return val === undefined ? defaultVal : val
        }
        function doSomething (name, age) {
         name = defaultValue(name, 'default name')
         age = defaultValue(age , 18)
         console.log(name, age)
        }

        這樣就很簡潔的在ES5實現(xiàn)了函數(shù)默認(rèn)參數(shù)的邏輯

        one momre things

        關(guān)于上邊的defaultValue函數(shù)實現(xiàn)方法,我們在合理的使用弱類型語言的優(yōu)勢后
        可以使用這種方式來省去三元運算符的操作:

        function defaultValue () {
         return arguments[+(arguments[0] === undefined)]
        }

        我們知道,arguments表示函數(shù)所有的實參

        我們使用arguments[0]獲取第一個實參,然后與undefined進(jìn)行全等比較

        在外層將表達(dá)式的結(jié)果轉(zhuǎn)換為Number,然后將這個值作為下標(biāo)獲取arguments中對應(yīng)的參數(shù)。

        因為是由Boolean值轉(zhuǎn)變而來,所以只會存在0、1兩種選項。

        也就實現(xiàn)了上邊三元運算符的功能。

        ES6

        ES6版本的函數(shù)默認(rèn)值基本上就是我們上邊實現(xiàn)的那種套路了

        但是因為是原生的,所以會有相應(yīng)的新語法,能夠更簡潔的使用:

        function doSomething (name = 'default name', age = 18) {
         console.log(name, age)
        }

        ES6中提供了新的語法,可以讓我們在函數(shù)聲明參數(shù)后邊直接寫= [defaultValue]的這種形式來設(shè)置某個參數(shù)的默認(rèn)值。
        直接使用這種方式,省去了在函數(shù)內(nèi)部進(jìn)行默認(rèn)值的檢查,能夠讓函數(shù)專注的做它應(yīng)該做的事情。

        如何針對某些必填參數(shù)拋出異常

        ES6這種新語法能夠讓我們很好的針對某個必填參數(shù)進(jìn)行錯誤提醒:

        function requireParams () {
         throw new Error('required params')
        }
        function doSomething (name = requireParams(), age = 18) {
         // do something
        }

        如果name參數(shù)為undefined,就會觸發(fā)默認(rèn)值規(guī)則

        然后調(diào)用requireParams函數(shù),而我們在函數(shù)中直接throw了一個Error

        復(fù)雜結(jié)構(gòu)參數(shù)的默認(rèn)值處理

        上邊的處理都是針對簡單的基本類型數(shù)據(jù)進(jìn)行處理的,但如果我們有如下的一個函數(shù):

        function init ({id, value}) {}
        init({
         id: 'tagId',
         value: 1
        })

        如果在ES5環(huán)境下,針對這種參數(shù)的默認(rèn)值處理將會變得無比復(fù)雜

        首先要判斷這一個參數(shù)是否存在,然后在判斷參數(shù)中的所有key是否存在

        而在ES6中,可以這樣來做:

        function init ({
         id = 'defaultId',
         value = 1
        } = {}) {
         console.log(id, value)
        }
        init()

        首先在解構(gòu)函數(shù)的后邊添加默認(rèn)值= {},然后針對每一項參數(shù)添加默認(rèn)值,很簡潔的就實現(xiàn)了我們的需求。

        ES5版本的polyfill代碼在倉庫中的位置:defaultValue

        參考資料

        1.MDN

        總結(jié)

        以上所述是小編給大家介紹的在ES5與ES6環(huán)境下處理函數(shù)默認(rèn)參數(shù)的實現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        在ES5與ES6環(huán)境下處理函數(shù)默認(rèn)參數(shù)的實現(xiàn)方法

        在ES5與ES6環(huán)境下處理函數(shù)默認(rèn)參數(shù)的實現(xiàn)方法:函數(shù)默認(rèn)值是一個很提高魯棒性的東西(就是讓程序更健壯) MDN關(guān)于函數(shù)默認(rèn)參數(shù)的描述:函數(shù)默認(rèn)參數(shù)允許在沒有值或undefined被傳入時使用默認(rèn)形參。 ES5 使用邏輯或來實現(xiàn) 眾所周知,在ES5版本中,并沒有提供的直接方法供我們我們處理函數(shù)默認(rèn)值 所以只
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产黄在线观看| 黄a大片av永久免费| 亚洲熟女少妇一区二区| 男女啪啪免费体验区| 亚洲av无码乱码在线观看野外| 理论亚洲区美一区二区三区| 处破痛哭A√18成年片免费| 亚洲一区二区三区高清不卡 | 亚洲AV无码一区二区三区系列 | 一个人免费观看视频在线中文| 亚洲国产一区视频| 2022国内精品免费福利视频| 中文亚洲AV片在线观看不卡| 在线看片免费人成视频福利| 久久青青草原亚洲av无码app| 1000部拍拍拍18勿入免费凤凰福利| 亚洲国产品综合人成综合网站| 久久久久久国产a免费观看黄色大片| 中中文字幕亚洲无线码| 高清国语自产拍免费视频国产| 精品一区二区三区无码免费直播 | 亚洲欧洲日产韩国在线| 免费看美女被靠到爽的视频| 日产久久强奸免费的看| 亚洲AV永久无码区成人网站| 男女超爽刺激视频免费播放| 国产精品亚洲五月天高清| 亚洲大片在线观看| 57PAO成人国产永久免费视频| 亚洲国产成人久久精品大牛影视| 亚洲成人影院在线观看| 日本在线免费播放| 亚洲最大中文字幕无码网站| 亚洲国产成人久久综合区| 99久久精品免费视频| 亚洲GV天堂无码男同在线观看| 国产亚洲美女精品久久久| 亚洲人成影院在线无码观看| 无码中文字幕av免费放dvd| 亚洲人AV在线无码影院观看| 亚洲精品国产精品乱码视色|