簡體   English   中英

JavaScript(ES5)中的參數數組

[英]Arguments Array in JavaScript (ES5)

也許那不是我晚上:/非常簡單的事情,我想將一個數組作為參數提供給作為參數數組的函數:

function add() {
    var sum = 0;
    for (var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}

以下作品:

console.log(add(1,2,3,4,5,6));

但是,如果我填充一個數組並將其作為參數,例如:

var myNumbers = [];
for (var i=0; i<100; i++){
    myNumbers.push(i);
}
console.log(add(myNumbers));

麻煩了 我想,我錯過了有關arguments數組的重要信息。

我應該如何更改添加功能,以便這兩種可能性都可以使用?

arguments對象是類似數組的對象,但不是數組。 它用於表示傳遞給函數的所有參數。 您僅將一個值傳遞給該函數,因此您的數組實際上位於arguments對象的索引0處。

但是,在這里使用arguments確實沒有多大意義,除非您需要在不定義顯式API的情況下動態處理事物。 只需在add函數中聲明您的參數即可。

function add(arr) {
    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
        sum += arr[i];
    }
    return sum;
}

如果您想同時支持這兩種情況,請按照您的評論進行操作:

function add() {
    var arr = [].concat.apply([], arguments);
    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
        sum += arr[i];
    }
    return sum;
}

的說明 [].concat.apply([], arguments)

  • []. Array.prototype簡寫,因為它是一個空數組。
  • concat將兩個或多個數組合並在一起,或者將一個數組和值合並到該數組中。
  • arguments不是數組,但是由於對象的某些類似於數組的特性-索引項和length屬性,許多原型函數都可以在其上使用。
  • apply調用具有給定上下文( this綁定)和任意數量參數的函數。 在這種情況下,我們仍然希望使用數組作為this值,以便能夠調用concat ,然后再調用傳遞給add所有參數。 結果只是將所有參數作為適當的數組。

此解決方案適用於兩種情況:

function add() {
    var arr= Array.prototype.slice.call(arguments);
    arr = [].concat.apply([], arr);

    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
      sum += arr[i];
    }
    return sum;
}

sum的簡單解決方案:

 function add() {
        var arr= Array.prototype.slice.call(arguments);
        arr = [].concat.apply([], arr);

        return arr.reduce(function(f, s){return f + s;}, 0);
    }

這里:

add(1,2,3,4,5,6);

......你調用add與一系列的離散 (分離)的參數,並且在它們中的每顯示出來arguments偽陣列,在1 arguments[0]在2 arguments[1]等等

但在這兒:

add(myNumbers);

...您正在用一個參數(數組)調用add 那是在arguments[0]

您將要編寫add以適合您的調用方式。 如果要使用離散參數調用它,請按照自己的方式編寫。 如果要編寫它來接受數組,請讓它接受一個參數並遍歷該參數(將是數組):

function add(args) {
    //       ^------------- the one argument
    var sum = 0;
    for (var i = 0; i < args.length; i++) {
        sum += args[i];
    }
    return sum;
}

如果要同時處理兩者 ,則可以使用Array.isArrayArray.isArray但可調整)來檢查第一個參數,以查看它是否為數組,如果是,則使用它;如果不是,則使用arguments

function add(args) {
    if (!Array.isArray(args)) {
        args = arguments;
    }
    var sum = 0;
    for (var i = 0; i < args.length; i++) {
        sum += args[i];
    }
    return sum;
}

旁注: arguments不是數組,而是類似數組的

您可以使用申請

add.apply(null, [1,2,3])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM