1. 程式人生 > >處理無命名引數

處理無命名引數

ES5 中的無命名引數

ES6 不定引數

ES6中,在函式的命名引數前新增三個點(...) 就表明這是一個不定引數,該引數為一個數組,包含著自它之後傳入的所有引數

通過這個陣列可以逐一訪問裡面的引數。使用不定引數重寫pick() 函式

在上述函式中,keys包含的是object之後傳入的所有引數(而arguments物件包含的則是所有傳入的引數,包括object)

函式的length屬性統計的是函式命名引數的數量,不定引數的加入不會影響length屬性的值,pick()函式length為1,只有object

不定引數的使用限制

(1)每個函式最多隻能宣告一個不定引數,而且一定要放在所有引數末尾

(2)不定引數不能用於物件字面量setter之中

物件字面量setter的引數只能為一個

 

不定引數對arguments物件的影響

不定引數設計的初衷是為了代替JavaScript的arguments物件。起初,在ECMAScript4草案中,arguments物件被移除並添加了不定引數的特性,從而可以傳入不限數量的引數

但是ECMAScript4 從未被標準化,這個想法被擱置了。直到重新引入了ECMAScript6 標準,唯一區別是arguments物件依然存在

如果宣告函式時定義了不定引數,則在函式被呼叫時,arguments物件包含了所有傳入函式的引數,就像這樣:

增強的Function建構函式

上述為通常利用Function建構函式建立函式的方式,接收字串形式的引數,分別為函式引數和函式體

ES6中支援在建立函式時定義預設引數和不定引數,如下:

也支援不定引數:

 

展開運算子

Math.max(), 接收任意數量的引數並返回值最大的那個

如果只處理兩個值,Math.max()非常簡單易用

但是如果想從陣列中返回最大值呢,該怎麼做呢,難道把陣列元素全部一個個寫入嗎,這不太現實!

ES5 早期版本中,可以使用apply() 方法

這個方案確實可行,但是難看出程式碼意圖

ES6 中使用不定引數就很方便了

可以將展開運算子與其他正常傳入的引數混合使用,假如你想限定Math.max() 返回的最小值為0,可以單獨傳入限定值,如下: