deep-in-es6(四)
阿新 • • 發佈:2017-12-04
等價 格式 一個 default 等於 傳值 index cat ani
不定參數和默認參數:
function containsAll(str) { for(var i = 1;i < arguments.length;i++) { var hasStr = arguments[i]; if( str.indexOf(hasStr) == -1 ) { return false; } } return true; } console.log( containsAll("banana","b","nan") );//true console.log( containsAll("banana","c","nan") );//false
上面例子中使用到了arguments對象,它是一個類數組對象,包含了傳遞給函數的所有參數。這樣的的傳參無法看到參數的具體個數,還有參數是從1開始叠代,arguments[0]相當於參數,如果要添加了參數,則必須要重新遍歷參數。
es6中的不定參數:
function containsAll6(str,...needles) { //alert(needles.length); for(var needle of needles) { if(str.indexOf(needle) == -1) {return false; } } return true; } //test... console.log( containsAll6("banana","b","nan") );// alert() == 2["b","nan"] true
...needles是es6中的信語法,稱為不定參數。執行函數後,傳進來的第一個參數賦值給str,...neddles不定參所有傳遞的參數被放到一個數組中,賦值給變量needles。
所有函數中,只有最後一個才可以被標記為不定參數。函數調用時,不定參數前的所有參數正常填充,參數都被放進一個數組中並賦值給不定參數,如果沒有額外的參數,不定參數就是個空數組。永遠不會是undefined。
默認參數:
通常情況下函數調用者不需要傳遞是有可能的函數,沒有被傳遞的參數可由感知到的默認參數進行填充。JavaScript有嚴格的默認參數格式,未被傳值的參數默認為undefined。es6引入了一種新的方式,可以指定任意參數的默認值。
function animalSentence(animals2="tiggers",animals3="bears") { return `lions and ${animals2} and ${animals3}! oh my!`; } console.log(animalSentence());//lions and tiggers and bears! oh my! console.log(animalSentence("mouse"));//lions and mouse and bears! oh my! console.log(animalSentence("pig","cat"));//lions and pig and cat! oh my!
默認參數的定義形式:[param1=[defaultValue1],...,paramN=[defaultValueN]],對於每個參數而言,定義默認值時=後面的部分是一個表達式,如果調用者沒有傳遞參數,將使用表達式的值作為默認的參數。
註意細節:
默認值表達式在函數調用是自左向右求值,這也意味著默認表達式可以使用該參數之前已經填充好的其他參數。
function animalSentencFancy(animals2="tiggers",animals3=(animals2 == "bears")?"sealions":"bears") { return `lions and ${animals2} and ${animals3}! oh my!`; } console.log(animalSentencFancy("bears"));//lions and bears and sealions! oh my! animals3的表達式是一個三元運算 console.log(animalSentencFancy(undefined,"unicorns"));
//lions and tiggers and unicorns! oh my! undefined值等於不傳值,沒有默認值的參數隱式默認為undefined。 function myFn(a=42,b) {...}//參數是合法的等價與 function myFn(a=42,b=undefined) {...}
deep-in-es6(四)