成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

不定參數(shù)(rest 參數(shù) ...)

Lucky_Boy / 2536人閱讀

摘要:但是,我們這樣寫的話,需要在每個(gè)支持不定參數(shù)的函數(shù)里,都這樣一段代碼,這樣實(shí)在不是很優(yōu)雅。實(shí)際使用中,也許我們都是直接使用,或用將轉(zhuǎn)成來支持不定參數(shù)不過,如果是在非的環(huán)境下,知道有這么一種實(shí)現(xiàn)方式,也是挺好的。

不定參數(shù) 如何實(shí)現(xiàn)不定參數(shù)

使用過 underscore.js 的人,肯定都使用過以下幾個(gè)方法:

_.without(array, *values) //返回一個(gè)刪除所有values值后的array副本
_.union(*arrays) //返回傳入的arrays(數(shù)組)并集
_.difference(array, *others)//返回來自array參數(shù)數(shù)組,并且不存在于other?數(shù)組
...

這些方法都有一個(gè)共同點(diǎn),就是可以傳入不定數(shù)量的參數(shù),例如,我想刪除掉 array 中的 value1,value2 ,可以這樣使用 , _.without(array,value1,value2);

那么,這個(gè)需要怎樣才能做到呢?

我們知道,js 中 function 里面,有一個(gè) arguments 參數(shù),它是一個(gè)類數(shù)組,里面包含著調(diào)用這個(gè)方法的所有參數(shù),所以可以這樣處理:

_.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數(shù)組,便可以進(jìn)一步處理了
    }
};

上面只是打個(gè)比方,想要支持不定參數(shù),我們要做的就是把固定參數(shù)和動(dòng)態(tài)參數(shù)從 arguments 中分離出來。
但是,我們這樣寫的話,需要在每個(gè)支持不定參數(shù)的函數(shù)里,都 copy 這樣一段代碼,這樣實(shí)在不是很優(yōu)雅。所以需要封裝成一個(gè)通用的函數(shù)。
我們直接看看 underscore 是封裝的好了。

restArgs 源碼
var restArgs = function(func, startIndex) {
    //startIndex ,表示幾個(gè)參數(shù)之后便是動(dòng)態(tài)參數(shù)
    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    return function() {
        var length = Math.max(arguments.length - startIndex, 0);
        //處理arguments,將動(dòng)態(tài)參數(shù)保存進(jìn)rest數(shù)組
        var rest = Array(length);
        for (var index = 0; index < length; index++) {
            rest[index] = arguments[index + startIndex];
        }
        //處理0,1,2三種情況,這里要多帶帶處理,是想優(yōu)先使用call,因?yàn)椋琧all的性能比apply要好一點(diǎn)
        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調(diào)用方法,將args作為參數(shù),args將為數(shù)組[固定參數(shù) ,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主要的邏輯處理方法,作為參數(shù),傳給restArgs,在restArgs中處理完參數(shù)后,使用call或apply調(diào)用邏輯處理方法
// 這時(shí)候接受到參數(shù)otherArrays,已經(jīng)是一個(gè)數(shù)組了,包含了之前的動(dòng)態(tài)參數(shù)。
_.without = restArgs(function(array, otherArrays) {
    //處理without具體事件
});

underscore.js 中利用 js 高級(jí)函數(shù)的特性,巧妙的實(shí)現(xiàn)了動(dòng)態(tài)參數(shù)

如果要使某函數(shù)支持不定參數(shù),只需要將該函數(shù)作為參數(shù),傳入 restArgs 中即可,例如:

function addByArray(values) {
    var sum = 0;
    for (var i = 0; i < values.length; i++) {
        sum += values[i];
    }
    return sum;
}
var add = restArgs(addByArray);
//調(diào)用:
addByArray([2, 5, 3, 6]); //16
add(2, 5, 3, 6); //16
ES6 不定參數(shù) (...)

ES6 引入了 rest 參數(shù),(形式為"...變量名"),用于獲取多余參數(shù),這樣就不需要使用 arguments 對(duì)象來實(shí)現(xiàn)了

function add(...values) {
    let sum = 0;
    for (var val of values) {
        sum += val;
    }
    return sum;
}
add(2, 5, 3); // 10
總結(jié)

在 underscore 中,restArgs 只是為了支持不定參數(shù)。實(shí)際使用中,也許我們都是直接使用 ES6,或用 babel 將 ES6 轉(zhuǎn)成 ES5 來支持不定參數(shù)

不過,如果是在非 es6 的環(huán)境下,知道有這么一種實(shí)現(xiàn)方式,也是挺好的。

:)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100261.html

相關(guān)文章

  • es6 -- 默認(rèn)參數(shù)Default,不定參數(shù)Rest,擴(kuò)展運(yùn)算符Spread詳解

    摘要:將數(shù)組中的每個(gè)元素展開為函數(shù)參數(shù)擴(kuò)展運(yùn)算符取代方法的一個(gè)實(shí)際的例子,應(yīng)用方法,簡化求出一個(gè)數(shù)組最大元素的寫法。 歡迎訪問我的個(gè)人博客:http://www.xiaolongwu.cn 前言 記錄一下在實(shí)際開發(fā)中,很有用的三個(gè)es6的新方法 用法詳解 默認(rèn)參數(shù) function f(x, y=13) { // 如果沒有傳入y或傳入了undefined,y的默認(rèn)值為13 retur...

    Betta 評(píng)論0 收藏0
  • 初學(xué)python,調(diào)用固定參,不固定參函數(shù)遇到的問題(持續(xù)更新)

    摘要:即,雙星號(hào)參數(shù)接收的參數(shù)作為字典。在有些情況下,單星號(hào)函數(shù)參數(shù)和雙星號(hào)函數(shù)參數(shù)是一起使用的,定義如下總結(jié)默認(rèn)值函數(shù)參數(shù)。雙星號(hào)函數(shù)參數(shù)。 函數(shù)調(diào)用時(shí)的參數(shù)傳遞方式:(調(diào)用函數(shù)) 傳遞方式有以下四種: 位置傳參 序列傳參 關(guān)鍵字傳參 字典關(guān)鍵字傳參---------------------------------------------------yu--- (1)位置傳參: 實(shí)際參...

    bingo 評(píng)論0 收藏0
  • ES6語法之函數(shù)的擴(kuò)展

    摘要:函數(shù)的擴(kuò)展函數(shù)參數(shù)的默認(rèn)值之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法。箭頭函數(shù)引入了一種新的函數(shù),叫做箭頭函數(shù)。箭頭函數(shù)和普通函數(shù)的行為非常相似,但是在語法構(gòu)成上非常不同。意味著函數(shù)內(nèi)的的值是全局對(duì)象,不是對(duì)象。 函數(shù)的擴(kuò)展 函數(shù)參數(shù)的默認(rèn)值 ES6 之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法。 function log(x, y) { y = y ||...

    Clect 評(píng)論0 收藏0
  • es6的解構(gòu)賦值、擴(kuò)展運(yùn)算符、rest參數(shù)使用

    摘要:模板字符串甚至還能嵌套解構(gòu)賦值允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)。運(yùn)算符使用場(chǎng)景應(yīng)該稍少一些,主要是處理不定數(shù)量參數(shù),可以避免對(duì)象的使用。 es6中較為常用的書寫風(fēng)格 為了書寫的方便,es6中提出了很多比較友好的書寫方式,其中最為常見的屬于以下幾個(gè): 字符串模板 `abcdef${test}` 解構(gòu)賦值 let [a, b, c] = [1,...

    xuweijian 評(píng)論0 收藏0
  • 詳解call bind apply - 區(qū)別/使用場(chǎng)景/es6實(shí)現(xiàn)/es3實(shí)現(xiàn)

    摘要:的區(qū)別接收數(shù)組一連串參數(shù)返回一個(gè)函數(shù)的使用場(chǎng)景將類數(shù)組含有屬性的對(duì)象轉(zhuǎn)化為數(shù)組類數(shù)組例如通過獲取的元素含有屬性的對(duì)象具有屬性,并且可以通過下標(biāo)來訪問其中的元素,但是沒有中的等方法。 call,apply,bind的區(qū)別 apply接收數(shù)組 func.apply(obj, [arus]) call一連串參數(shù) func.call(obj, param1, param2....) bind...

    Alex 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<