2017-01-28 8 views
1

Может быть, это не мой вечер:/Очень простая вещь, я хочу дать массив в качестве параметра функции в качестве аргументов массива:Аргументы массива в 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.

Как изменить функцию добавления, чтобы обе возможности могли работать с ней?

+0

Во втором случае myNumbers является массивом (так что попробуйте получить доступ к аргументам [0]) в функции добавления – Sai

ответ

1

Здесь:

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.isArray (довольно новый, но shimmable), чтобы проверить первый аргумент, чтобы увидеть, если это массив, а также использовать его, если он есть, или использовать 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; 
} 

Side Примечание: arguments не является массив, это ju st array-like.

+0

thank вы, как мне изменить функцию добавления, чтобы обе работали? – Lonely

+0

@Lonely: вы можете определить, является ли первый аргумент массивом через ['Array.isArray'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray) (это новизна, но легко подгоняется для старых браузеров). Затем либо используйте первый аргумент, либо 'arguments'. Я добавил пример. –

2

Объект arguments Объект представляет собой массивный объект, но это не массив. Он используется для представления всех аргументов, переданных в функцию. Вы передали только одно значение в функцию, поэтому ваш массив фактически находится в индексе 0 объекта arguments.

Однако здесь не так много смысла, используя 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. Результат - это просто все аргументы как правильный массив.
+0

спасибо, как мне изменить функцию добавления, чтобы обе работали? – Lonely

+0

@ Lonely См. Обновленный ответ, который будет обрабатывать оба случая. –

+0

- это то, что 'var arr = [] .concat.apply ([], arguments);' кросс-браузер совместим? – Lonely

1

Вы можете использовать apply

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

Это решение работает как для ситуации:

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; 
} 

Также простое решение для суммы:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^