[譯]JavaScript中的剩余參數和默認參數


原文:http://blog.mozilla.org/jorendorff/2012/05/29/rest-arguments-and-default-arguments-in-javascript/


在過去的兩周,Benjamin Peterson在SpiderMonkey中實現了兩個ES6新特性.如果你經常寫JS的話,一定會喜歡這兩個特性.

剩余參數(Rest arguments)是我們熟悉的arguments對象的很好的替代品.語法如下:

function f(arg1, arg2, ...rest) {
    alert("你傳入了" + rest.length + "個額外的參數.");
}

這非常類似於Python, Lisp, 以及Ruby中的剩余參數.在每次調用函數f的時候,前幾個形參都會按照順序被賦上對應的實參值,在這個例子中就是arg1和arg2.其他多出來的實參就會存儲在數組rest中.如果沒有傳入多余的實參,rest就是一個空數組.

arguments對象不同的是,一個剩余參數是一個真實的數組,也就是說可以使用所有的數組方法,包括.shift(), .forEach(), .map()等.還有一個很重要的差別是,arguments對象在每一級的嵌套函數中都會被重新定義,不管你需要不需要,而剩余參數不會,就和普通變量一樣,可以在閉包中通過作用域鏈訪問到上層函數的剩余參數.

默認參數(Default arguments)是這樣的:

function fade(element, seconds=0.5, targetOpacity=0) {
    $(element).animate({opacity: targetOpacity}, seconds * 1000);
}

當你調用這個函數的時候,如果你沒有給某個擁有默認值的形參傳值,則這些形參會自動被賦上默認值.

fade(form, 0.2, 1);  // 沒有使用默認值:
                     // 快速淡入
fade(form, 3);       // targetOpacity設置為默認值0:
                     // 緩慢淡出
fade(form);          // seconds設置為默認值0.5,
                     // targetOpacity設置為默認值0:
                     // 正常速度淡出

默認值可以是任意的表達式,甚至還可以使用到前面的形參,比如:

function logEvent(event, logger=findLoggerFor(event.target)) {
    ...
}

logger的默認值依賴於event參數.

(默認參數的一些技術細節:和Python不同的是,在函數每次被調用時,這個默認參數的值都會被重新計算,也就是說,如果一個參數的默認值被設置為=[]的話,該參數的值每次都會是一個新的數組.另外一個需要注意的是,目前的提案規定如下,僅在調用者省略一個實參的情況下,對應的形參才會取默認值.如果調用者顯式的傳一個undefined值給形參,則該形參的值就是undefined,而不會去取默認值.不過現在TC39正在討論,看要不要改成,即使在調用者顯式傳入undefined的情況下也讓形參取默認值.雖然其他語言沒有這么干的,但在用JavaScript操作DOM的使用中,很多情況下都適合這么干.現在SpiderMonkey是依據當前的提案來實現的,一旦提案有改變,我們會更新我們的實現.)

譯者注:讀者也許不理解和python比較的這幾句話,如果你想知道的話:

在python中,擁有默認參數值的參數有時並不像是在JavaScript中的局部變量一樣每次都重新求值.看個例子:

>>> def spam(eggs=[]): 
...     eggs.append("spam")
...     return eggs
... 
>>> spam()
['spam']
>>> spam()
['spam', 'spam']
>>> spam()
['spam', 'spam', 'spam']
>>> spam()
['spam', 'spam', 'spam', 'spam']

這兩個新特性都有望成為ES6標准的一部分.Benjamin依然干勁十足,他會給我們帶來更多新東西.

譯者注:Benjamin Peterson是一個今年剛剛進入Mozilla的實習生,他的另一項壯舉是刪除了由Brendan Eich最初編寫,在SpiderMonkey中用了17年的反編譯器.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM