javascript中函數(shù)參數(shù)深入分析以及參數(shù)優(yōu)先級(jí)

函數(shù)的組成

javascript(在下文中簡(jiǎn)稱(chēng)為js)中函數(shù)是一等公民咆耿。

函數(shù)的組成分為:函數(shù)名杆煞,函數(shù)執(zhí)行語(yǔ)句體娩嚼,參數(shù)三部分組成蘑险,當(dāng)然函數(shù)的參數(shù)相對(duì)于函數(shù)來(lái)說(shuō)是可以存在的,也可以不存在岳悟。這里就不賣(mài)關(guān)子了佃迄。


函數(shù)的參數(shù)

現(xiàn)在主要討論的就是函數(shù)的參數(shù)問(wèn)題。函數(shù)的參數(shù)我們大致分為:實(shí)參與形參贵少。

????1.實(shí)參:可以粗略的理解成當(dāng)在調(diào)用函數(shù)時(shí)候需要向函數(shù)執(zhí)行體中傳入的指令呵俏。

????2.形參:可以理解成函數(shù)在定義時(shí),需要接受到相關(guān)的指令來(lái)執(zhí)行函數(shù)體語(yǔ)句的實(shí)參指令的占位符滔灶。


函數(shù)定義參數(shù)與傳入的參數(shù)差異問(wèn)題

????在js中普碎,允許函數(shù)定義參數(shù)與傳入的參數(shù)的數(shù)量不一致(這也是js靈活的地方與操蛋的地方)。我們知道當(dāng)傳參與定義參不一致的時(shí)候宽气,我們就會(huì)考慮參數(shù)定義的順序随常、參數(shù)的類(lèi)型、參數(shù)的默認(rèn)值萄涯,參數(shù)是否接受到值等一系列問(wèn)題绪氛。

????在ES5至以前,我們對(duì)于不定數(shù)目的參數(shù)涝影,使用?arguments?這個(gè)類(lèi)數(shù)組(具有l(wèi)ength屬性的對(duì)象)來(lái)統(tǒng)一接收函數(shù)調(diào)用時(shí)所傳入的所有參數(shù)枣察。請(qǐng)看下面例子:

使用arguments接收函數(shù)參數(shù)

? ? 輸出的結(jié)果:

返回的結(jié)果

????很顯然 argument 是不管在函數(shù)中是否有定義形參,全部接收在函數(shù)調(diào)用處傳入進(jìn)來(lái)的實(shí)參。

ES6對(duì)arguments的改變

? ? 在函數(shù)的定義過(guò)程中序目,是有可能改變形參的值情況出現(xiàn)臂痕。當(dāng)在函數(shù)執(zhí)行體中,我們先改變了形參的值猿涨,然后使用 arguments 來(lái)讀取傳入的實(shí)參握童。

改變形參的值

輸出的結(jié)果為:

arguments的值被改變

? ? 很顯然的就能看出形參的值在函數(shù)執(zhí)行體中被改變了,arguments的值也會(huì)被改變叛赚。這樣在函數(shù)形參值改變之后獲取arguments的值是不準(zhǔn)確的澡绩。因此在es6中不建議使用arguments來(lái)獲取接收不定數(shù)目的參數(shù)。

擴(kuò)展運(yùn)算符(...)對(duì)函數(shù)不定參數(shù)的影響

? ? 上面說(shuō)到在es6之后不建議使用arguments來(lái)進(jìn)行不定參數(shù)的接收之后俺附,應(yīng)該使用怎么樣的一種方式來(lái)接收不定參數(shù)較為妥當(dāng)肥卡?

? ? 在 es6中使用擴(kuò)展運(yùn)算符(...)來(lái)替代arguments對(duì)不定參數(shù)的接收。

? ? 擴(kuò)展運(yùn)算符(...):可以理解成一個(gè)默認(rèn)的遍歷器(本章節(jié)只討論擴(kuò)展運(yùn)算符對(duì)函數(shù)參數(shù)上的應(yīng)用)事镣。

擴(kuò)展運(yùn)算符接收不定參

輸出結(jié)果為:

從輸出的結(jié)果可以看出擴(kuò)展運(yùn)算符會(huì)把函數(shù)調(diào)用傳入的參數(shù)封裝到一個(gè)數(shù)組中輸出步鉴。

在函數(shù)體語(yǔ)句中我們可以改變...arg的值:

輸出結(jié)果為:

? ? 這樣就能夠清晰的通過(guò)一個(gè)顯示的變量來(lái)接收所有的不定數(shù)目的參數(shù)璃哟。避免在形參值改變之后使用argments來(lái)獲取傳入的實(shí)參值氛琢。

函數(shù)參數(shù)的默認(rèn)值

? ? 在定義函數(shù)時(shí),通常會(huì)給定形參一個(gè)默認(rèn)值沮稚,以便當(dāng)不傳實(shí)參時(shí)艺沼,使用默認(rèn)值來(lái)進(jìn)行替代。現(xiàn)在主要說(shuō)的是ES6中的默認(rèn)參數(shù)值蕴掏。

輸出的結(jié)果為:

明顯的看出當(dāng)不傳參數(shù)的時(shí)候使用的是默認(rèn)值中的值障般。

????那么問(wèn)題來(lái)了,一般在定義函數(shù)參數(shù)的使用盛杰,不可能把所有的默認(rèn)參都放在最后面挽荡,因?yàn)樵谇懊娑继岬竭^(guò)函數(shù)的傳入?yún)?shù)和接收參數(shù)是可以數(shù)目不一致的。在下面的例子中即供,我們應(yīng)該如何獲取到默認(rèn)值定拟?

? ? 說(shuō)到這里了一定會(huì)有人說(shuō),直接調(diào)用foo()就可以獲取到a的默認(rèn)值了逗嫡。如果你是這樣想青自,你就沒(méi)有考慮清除,當(dāng)然這么做是對(duì)的驱证,因?yàn)槭纠@樣執(zhí)行是能夠得到默認(rèn)值這個(gè)答案的延窜。

? ? 稍微得把代碼改變一下,你看使用foo()來(lái)執(zhí)行是否可以抹锄?

當(dāng)然這樣執(zhí)行是不報(bào)錯(cuò)的逆瑞,但是結(jié)果是這樣的荠藤,得不到a的值。這就更加沒(méi)辦法輸出a的值了获高,更加談不上獲取默認(rèn)值哈肖。

針對(duì)上面的情況,接下來(lái)就是一個(gè)從來(lái)都在被輕視而且特別重要的問(wèn)題出現(xiàn)了念秧?什么問(wèn)題呢淤井?請(qǐng)看下面的大標(biāo)題。

函數(shù)參數(shù)的優(yōu)先級(jí)

? ? 都聽(tīng)說(shuō)過(guò)運(yùn)算符的優(yōu)先級(jí)出爹,js中this的優(yōu)先級(jí)∽穑現(xiàn)在來(lái)了一個(gè)新的概念:函數(shù)參數(shù)的優(yōu)先級(jí)。

? ? 針對(duì)上面輸出函數(shù)參數(shù)默認(rèn)值的問(wèn)題严就,在這個(gè)時(shí)候就可以解決了。

? ? 函數(shù)參數(shù)的優(yōu)先級(jí):是針對(duì)函數(shù)調(diào)用時(shí)候的傳入實(shí)參的優(yōu)先級(jí)比較器罐,不是針對(duì)形參的梢为。

? ? 現(xiàn)在我們來(lái)改寫(xiě)一下,上面出現(xiàn)問(wèn)題中的函數(shù)調(diào)用就可以獲取到a的默認(rèn)值轰坊,如下所示:

改寫(xiě)函數(shù)調(diào)用

????把需要獲取默認(rèn)值的形參對(duì)應(yīng)的實(shí)參使用undefined來(lái)進(jìn)行傳入的時(shí)候铸董,我們突然發(fā)現(xiàn)。居然可以輸出 a = 1肴沫。

輸出結(jié)果

? ? 是不是覺(jué)得特別神奇粟害。當(dāng)初我也是這么覺(jué)得的。

? ? 說(shuō)到這里颤芬,發(fā)現(xiàn)可以使用undefined 來(lái)進(jìn)行占位悲幅,讓函數(shù)輸出其默認(rèn)值。腦袋里會(huì)順勢(shì)想到使用null是不是也可以站蝠。很顯然猜測(cè)是最沒(méi)有底氣的√撸現(xiàn)在我們實(shí)際調(diào)用來(lái)看看。

? ? 輸出的結(jié)果為:

? ? 很顯然菱魔,不能得到a的默認(rèn)值留荔。

? ? 接下來(lái)我們使用比較特殊的NaN來(lái)嘗試一下。直接上代碼:

? ? 輸出的結(jié)果為:

? ? NaN很顯然也會(huì)覆蓋掉默認(rèn)值澜倦。

? ? 至于一般的數(shù)據(jù)類(lèi)型(string聚蝶,number,? boolean, object)等類(lèi)型希望大家去嘗試一下,是否能夠覆蓋藻治,在這里我就不一一的描述碘勉。

? ? 優(yōu)先級(jí)總結(jié):從上面的例子中,發(fā)現(xiàn)undefined不能覆蓋參數(shù)默認(rèn)值栋艳,null和NaN都能去覆蓋參數(shù)默認(rèn)值恰聘,可以得出函數(shù)參數(shù)的優(yōu)先級(jí):undefined < 默認(rèn)參 < 除undefined以外的實(shí)參?(NaN /?null)。

? ? 如有不足,歡迎各位大神指正晴叨!

? ? 原創(chuàng)文章轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/52f26809ceb4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凿宾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子兼蕊,更是在濱河造成了極大的恐慌初厚,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孙技,死亡現(xiàn)場(chǎng)離奇詭異产禾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)牵啦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)蔚出,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人琢唾,你說(shuō)我怎么就攤上這事兴蒸。” “怎么了裳瘪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵土浸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我彭羹,道長(zhǎng)黄伊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任派殷,我火速辦了婚禮还最,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愈腾。我一直安慰自己憋活,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布虱黄。 她就那樣靜靜地躺著悦即,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橱乱。 梳的紋絲不亂的頭發(fā)上辜梳,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音泳叠,去河邊找鬼作瞄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛危纫,可吹牛的內(nèi)容都是我干的宗挥。 我是一名探鬼主播乌庶,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼契耿!你這毒婦竟也來(lái)了瞒大?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搪桂,失蹤者是張志新(化名)和其女友劉穎透敌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體踢械,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酗电,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了内列。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撵术。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖话瞧,靈堂內(nèi)的尸體忽然破棺而出荷荤,到底是詐尸還是另有隱情,我是刑警寧澤移稳,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站会油,受9級(jí)特大地震影響个粱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翻翩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一都许、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫂冻,春花似錦胶征、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至服傍,卻和暖如春钱雷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吹零。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工罩抗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灿椅。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓套蒂,卻偏偏與公主長(zhǎng)得像钞支,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子操刀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)和對(duì)象 1烁挟、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門(mén)語(yǔ)言來(lái)說(shuō)都是核心的概念。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句馍刮,而且...
    道無(wú)虛閱讀 4,543評(píng)論 0 5
  • 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真信夫,是 HTML 最堅(jiān)實(shí)的梁柱;分享卡啰,是 CSS 里最閃耀的一瞥静稻;...
    iKcamp閱讀 1,371評(píng)論 0 2
  • 函數(shù)只定義一次,但可能被執(zhí)行或調(diào)用任意次匈辱。JS函數(shù)是參數(shù)化的振湾,函數(shù)的定義會(huì)包括一個(gè)稱(chēng)為形參的標(biāo)識(shí)符列表,這些參數(shù)在...
    PySong閱讀 519評(píng)論 0 0
  • 函數(shù)只定義一次亡脸,但可能被執(zhí)行或調(diào)用任意次押搪。JS函數(shù)是參數(shù)化的,函數(shù)的定義會(huì)包括一個(gè)稱(chēng)為形參的標(biāo)識(shí)符列表浅碾,這些參數(shù)在...
    PySong閱讀 310評(píng)論 0 0
  • 函數(shù)只定義一次大州,但可能被執(zhí)行或調(diào)用任意次。JS函數(shù)是參數(shù)化的垂谢,函數(shù)的定義會(huì)包括一個(gè)稱(chēng)為形參的標(biāo)識(shí)符列表厦画,這些參數(shù)在...
    PySong閱讀 846評(píng)論 0 0