Подтвердить что ты не робот

Javascript добавляет дополнительный аргумент

Давайте посмотрим на этот код:

var mainFunction = function() {
  altFunction.apply(null, arguments);
}

Аргументы, которые передаются в "mainFunction", являются динамическими, они могут быть 4 или 10 не имеют значения. Однако я должен передать их в altFunction. Я должен добавить аргумент EXTRA в список аргументов.

Я пробовал это:

var mainFunction = function() {
  var mainArguments = arguments;
  mainArguments[mainArguments.length] = 'extra data'; // not +1 since length returns "human" count.

  altFunction.apply(null, mainArguments);
}

Но это не работает, как я могу это сделать?

4b9b3361

Ответ 1

arguments не является чистым массивом. Вам нужно сделать из него нормальный массив:

var mainArguments = Array.prototype.slice.call(arguments);
mainArguments.push("extra data");

Ответ 2

Используйте Array.prototype.push

[].push.call(arguments, "new value");

Нет необходимости отмечать клонированный объект arguments, потому что он и его .length изменяемы.

(function() {
    console.log(arguments[arguments.length - 1]); // foo

    [].push.call(arguments, "bar");

    console.log(arguments[arguments.length - 1]); // bar
})("foo");

Из ECMAScript 5, 10.6 Объект аргументов

  1. Вызвать внутренний метод [[DefineOwnProperty]] при передаче obj "length", дескриптор свойства {[[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true} и false как аргументы.

Итак, вы можете видеть, что .length можно записывать, поэтому он будет обновляться с помощью методов Array.

Ответ 3

Объект arguments не является массивом; он как массив, но он другой. Однако вы можете превратить его в массив:

var mainArguments = [].slice.call(arguments, 0);

Затем вы можете нажать другое значение в конце:

mainArguments.push("whatever");

Ответ 4

var mainFunction = function() {
    var args = [].slice.call( arguments ); //Convert to array
    args.push( "extra data");
    return altFunction.apply( this, args );
}

Ответ 5

Массив arguments не является массивом (это ошибка дизайна в JavaScript, согласно Крокфорду), поэтому вы не можете этого сделать. Вы можете включить его в массив, но:

var mainFunction = function() {
  var mainArguments = Array.prototype.slice.call(arguments);
  mainArguments.push('extra data');

  altFunction.apply(null, mainArguments);
}

Ответ 6

Один вкладыш для добавления дополнительных аргументов (ов) и возврата нового массива:

[].slice.call(arguments).concat(['new value']));

Ответ 7

//
//    var
//        altFn  = function () {}, 
//        mainFn = prefilled( altFn  /* ...params */ );
//
//    mainFn(  /* ...params */  );
//  
//        
function prefilled ( fn /* ...params */ ) { 
     return ( function ( args1 ) { 

          var orfn = this;

          return function () { 

              return orfn.apply( this, args1.concat( cslc( arguments ) ) );

          };

     } ).call( fn, cslc( arguments, 1 ) );
}

// helper fn
function cslc( args, i, j ) { 
   return Array.prototype.slice.call( args, i, j );
}


// example

var
    f1 = function () { console.log( cslc( arguments ) ); }, 
    F1 = prefilled( f1, 98, 99, 100 );

F1( 'a', 'b', 'c' );

//
//   logs: [98, 99, 100, "a", "b", "c"]
//
//

Ответ 8

Обновление 2016: перед добавлением элемента необходимо преобразовать аргументы в массив. В дополнение к методу среза, упомянутому во многих сообщениях:

var args = Array.prototype.slice.call(arguments);

Вы также можете использовать метод Array.from() или оператор распространения для преобразования аргументов в реальный массив:

var args = Array.from(arguments);

или

var args = [...arguments];

Вышеуказанное не может быть оптимизировано вашим механизмом javascript, это было предложено MDN, которое может быть оптимизировано:

var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments

Ответ 9

В этом случае было бы удобнее использовать call() вместо apply():

function first(parameter1, parameter2) {

  var parameter3 = "123";

  secondFunction.call(
    this,
    parameter1,
    parameter2,
    parameter3);
},

Ответ 11

Для тех, кто любит меня, мы искали способ добавить аргумент, который является необязательным, и может быть не единственным пропущенным (myFunc = function(reqiured,optional_1,optional_2,targetOptional) с вызовом myFunc(justThisOne)), это может делаться следующим образом:

// first we make sure arguments is long enough
// argumentPosition is supposed to be 1,2,3... (4 in the example above)
while(arguments.length < argumentPosition)
    [].push.call(arguments,undefined);
// next we assign it
arguments[argumentPosition-1] = arguments[argumentPosition-1] || defaultValue;