不定參數,這讓我想起2件事情:
①java的可變參數。感覺ECMAScript6的不定參數跟java的可變參數真像。
②js的arguments對象。其實arguments對象也能實現不定參數的效果,只不過其可讀性不高,進而導致後期維護比較麻煩。另外在原先函數基礎上添加/減少參數個數,導致arguments對應的索引還得修改,太麻煩。
不定參數規則:
①在函數參數中,如果有不定參數的話,則只有最後一個參數纔可以被標記爲不定參數。
②不定參數就是在參數前面追加省略號,例如:...names。
③調用時,其他參數必須填充。
不定參數運行過程:
函數被調用時,不定參數前的所有參數都正常填充,任何額外的 參數都被放進一個數組中並賦值給不定參數。如果沒有額外的參數,不定參數就是一個空數組,它永遠不會是undefined。
說起參數賦值這裏,ECMAScript6做了修改:
按照之前JS函數的用法,我在調用時可以傳遞部分參數,這就導致沒傳遞的參數取值問題,JS會對其設置默認值undefined。
到了ES6時,這種局面被打破了,可以指定參數的默認值,例如:
function stduent(name="ZhangSan", age="12") {xxxxxxxx}默認參數的定義形式爲:[param1[=defaultValue1][,paramN[= defaultValueN]]]
如果調用者沒有傳遞相應參數,將使用該表達式defaultValue的值作爲參數默認值。
這裏有個小技巧:
默認值表達式在函數調用時自左向右求值,這就意味着後面的參數可以使用該參數之前已經填充好的其他參數值,至於沒有默認值的參數,其隱式還是默認爲undefined。例如:
function stduent(name="ZhangSan",age=(name=="LiSi") ? "10" : "12") {xxxxxxxx}