摘要:但是,我們這樣寫的話,需要在每個支持不定參數的函數里,都這樣一段代碼,這樣實在不是很優雅。實際使用中,也許我們都是直接使用,或用將轉成來支持不定參數不過,如果是在非的環境下,知道有這么一種實現方式,也是挺好的。
不定參數 如何實現不定參數
使用過 underscore.js 的人,肯定都使用過以下幾個方法:
_.without(array, *values) //返回一個刪除所有values值后的array副本 _.union(*arrays) //返回傳入的arrays(數組)并集 _.difference(array, *others)//返回來自array參數數組,并且不存在于other?數組 ...
這些方法都有一個共同點,就是可以傳入不定數量的參數,例如,我想刪除掉 array 中的 value1,value2 ,可以這樣使用 , _.without(array,value1,value2);
那么,這個需要怎樣才能做到呢?我們知道,js 中 function 里面,有一個 arguments 參數,它是一個類數組,里面包含著調用這個方法的所有參數,所以可以這樣處理:
_.without = function() { if (arguments.length > 0) { var array = arguments[0]; var values = []; for (var i = 1; i < arguments.length; i++) { values.push(arguments[i]); } //這樣得到了array,和values數組,便可以進一步處理了 } };
上面只是打個比方,想要支持不定參數,我們要做的就是把固定參數和動態參數從 arguments 中分離出來。
但是,我們這樣寫的話,需要在每個支持不定參數的函數里,都 copy 這樣一段代碼,這樣實在不是很優雅。所以需要封裝成一個通用的函數。
我們直接看看 underscore 是封裝的好了。
var restArgs = function(func, startIndex) { //startIndex ,表示幾個參數之后便是動態參數 startIndex = startIndex == null ? func.length - 1 : +startIndex; return function() { var length = Math.max(arguments.length - startIndex, 0); //處理arguments,將動態參數保存進rest數組 var rest = Array(length); for (var index = 0; index < length; index++) { rest[index] = arguments[index + startIndex]; } //處理0,1,2三種情況,這里要多帶帶處理,是想優先使用call,因為,call的性能比apply要好一點 switch (startIndex) { case 0: return func.call(this, rest); case 1: return func.call(this, arguments[0], rest); case 2: return func.call(this, arguments[0], arguments[1], rest); } //如果startIndex不是0,1,2三種情況,則使用apply調用方法,將args作為參數,args將為數組[固定參數 ,rest]; var args = Array(startIndex + 1); for (index = 0; index < startIndex; index++) { args[index] = arguments[index]; } args[startIndex] = rest; return func.apply(this, args); }; }; //這里without主要的邏輯處理方法,作為參數,傳給restArgs,在restArgs中處理完參數后,使用call或apply調用邏輯處理方法 // 這時候接受到參數otherArrays,已經是一個數組了,包含了之前的動態參數。 _.without = restArgs(function(array, otherArrays) { //處理without具體事件 });
underscore.js 中利用 js 高級函數的特性,巧妙的實現了動態參數
如果要使某函數支持不定參數,只需要將該函數作為參數,傳入 restArgs 中即可,例如:
function addByArray(values) { var sum = 0; for (var i = 0; i < values.length; i++) { sum += values[i]; } return sum; } var add = restArgs(addByArray); //調用: addByArray([2, 5, 3, 6]); //16 add(2, 5, 3, 6); //16ES6 不定參數 (...)
ES6 引入了 rest 參數,(形式為"...變量名"),用于獲取多余參數,這樣就不需要使用 arguments 對象來實現了
function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, 5, 3); // 10總結
在 underscore 中,restArgs 只是為了支持不定參數。實際使用中,也許我們都是直接使用 ES6,或用 babel 將 ES6 轉成 ES5 來支持不定參數
不過,如果是在非 es6 的環境下,知道有這么一種實現方式,也是挺好的。
:)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/100261.html
摘要:將數組中的每個元素展開為函數參數擴展運算符取代方法的一個實際的例子,應用方法,簡化求出一個數組最大元素的寫法。 歡迎訪問我的個人博客:http://www.xiaolongwu.cn 前言 記錄一下在實際開發中,很有用的三個es6的新方法 用法詳解 默認參數 function f(x, y=13) { // 如果沒有傳入y或傳入了undefined,y的默認值為13 retur...
摘要:即,雙星號參數接收的參數作為字典。在有些情況下,單星號函數參數和雙星號函數參數是一起使用的,定義如下總結默認值函數參數。雙星號函數參數。 函數調用時的參數傳遞方式:(調用函數) 傳遞方式有以下四種: 位置傳參 序列傳參 關鍵字傳參 字典關鍵字傳參---------------------------------------------------yu--- (1)位置傳參: 實際參...
摘要:函數的擴展函數參數的默認值之前,不能直接為函數的參數指定默認值,只能采用變通的方法。箭頭函數引入了一種新的函數,叫做箭頭函數。箭頭函數和普通函數的行為非常相似,但是在語法構成上非常不同。意味著函數內的的值是全局對象,不是對象。 函數的擴展 函數參數的默認值 ES6 之前,不能直接為函數的參數指定默認值,只能采用變通的方法。 function log(x, y) { y = y ||...
摘要:模板字符串甚至還能嵌套解構賦值允許按照一定模式,從數組和對象中提取值,對變量進行賦值,這被稱為解構。運算符使用場景應該稍少一些,主要是處理不定數量參數,可以避免對象的使用。 es6中較為常用的書寫風格 為了書寫的方便,es6中提出了很多比較友好的書寫方式,其中最為常見的屬于以下幾個: 字符串模板 `abcdef${test}` 解構賦值 let [a, b, c] = [1,...
摘要:的區別接收數組一連串參數返回一個函數的使用場景將類數組含有屬性的對象轉化為數組類數組例如通過獲取的元素含有屬性的對象具有屬性,并且可以通過下標來訪問其中的元素,但是沒有中的等方法。 call,apply,bind的區別 apply接收數組 func.apply(obj, [arus]) call一連串參數 func.call(obj, param1, param2....) bind...
閱讀 1307·2021-11-23 09:51
閱讀 3423·2021-09-06 15:00
閱讀 998·2021-08-16 10:57
閱讀 1384·2019-08-30 12:46
閱讀 948·2019-08-29 12:22
閱讀 1616·2019-08-29 11:07
閱讀 3161·2019-08-26 11:23
閱讀 2993·2019-08-23 15:14