Javascript 添加额外参数

Javascript 添加额外参数,javascript,Javascript,让我们看看这段代码: var mainFunction = function() { altFunction.apply(null, arguments); } 传递给main函数的参数是动态的——它们可以是4或10,这无关紧要。但是,我必须将它们传递到altFunction,并且必须在参数列表中添加一个额外的参数 我试过这个: var mainFunction = function() { var mainArguments = arguments; mainArguments[

让我们看看这段代码:

var mainFunction = function() {
  altFunction.apply(null, arguments);
}
传递给
main函数的参数是动态的——它们可以是4或10,这无关紧要。但是,我必须将它们传递到
altFunction
,并且必须在参数列表中添加一个额外的参数

我试过这个:

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

  altFunction.apply(null, mainArguments);
}

但这似乎不起作用。我该怎么做?

参数对象不是数组;它就像一个数组,但它是不同的。但是,您可以将其转换为数组:

var mainArguments = [].slice.call(arguments, 0);
然后,可以将另一个值推送到末端:

mainArguments.push("whatever");

参数
不是纯数组。您需要从中创建一个普通数组:

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

使用
Array.prototype.push

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

无需浅克隆
参数
对象,因为它及其
长度
是可变的

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

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

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

从ECMAScript 5

  • 在obj上调用
    [[DefineOwnProperty]]
    内部方法传递
    “length”
    ,属性描述符
    {[[Value]]:len、[[Writable]]:true、[[Enumerable]]:false、[[Configurable]]:true}
    和false作为参数

  • 因此,您可以看到
    .length
    是可写的,因此它将使用数组方法进行更新。

    参数
    “数组”不是数组(根据Crockford的说法,它是JavaScript中的一个设计错误),因此您不能这样做。不过,您可以将其转换为数组:

    var mainFunction = function() {
      var mainArguments = Array.prototype.slice.call(arguments);
      mainArguments.push('extra data');
    
      altFunction.apply(null, mainArguments);
    }
    

    一个用于添加其他参数并返回新数组的行程序:

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

    更新2016:在添加元素之前,必须将参数转换为数组。除了许多帖子中提到的切片方法外:

    var args = Array.prototype.slice.call(arguments);
    
    还可以使用Array.from()方法或spread运算符将参数转换为实数组:

    var args = Array.from(arguments);
    

    您的javascript引擎可能不会对上述内容进行优化,MDN建议对以下内容进行优化:

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

    在这种情况下,使用
    call()
    而不是
    apply()
    会更舒服:

    
    var myABC='12321';
    someFunction(result,error,myCallback.bind(this,myABC));
    


    参考资料:

    对于那些喜欢我的人,他们正在寻找一种方法来添加可选的参数,并且可能不是唯一省略的参数(
    myFunc=function(Required,optional\u 1,optional\u 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;
    
    //首先我们要确保参数足够长
    //参数位置应该是1,2,3。。。(上例中为4)
    while(arguments.length
    既然length返回“human”count,那么
    非+1是什么意思?
    length返回4如果数组为0、1、2、3,则不返回3,希望您现在理解它。这就是我的意思:是的,但这是
    .length
    的预期行为。使用
    arr[arr.length]=“whatever”
    时,其行为与使用
    .push()
    时相同,只需将项目添加到数组的末尾。您的问题是,
    参数
    不是一个数组,因此您需要使用所提供的许多类似解决方案中的一个。实际上,您几乎拥有了它。如果在调用apply之前也执行
    参数。length++
    ,那么代码将按原样工作。为什么这是一个bug?因为你不喜欢?因为道格拉斯·克罗克福德说so@CallumMacrae:在我看来,这不是什么原因。也许这是个糟糕的设计,但这和bug不一样。在我看来,bug是指某些东西不能按预期的方式工作。我假设
    arguments
    是一个类似于数组的对象,而不是一个有意的数组,不管是否明智。为了节省内存,arguments原型缺少通用的数组功能,只有基本功能。想一想,有多少阵列?让我们猜猜,函数调用的数量是多少?如果你能节省空间,不是吗?如果需要,可以使用apply函数来处理参数已传递到完整功能数组的情况。其他一切都取决于用户。是的,我本可以发誓
    参数
    是只读的,但后来我重新阅读了MDN规范并意识到了这一点[]。splice.call(arguments,0,0,NEW_VAR)将其放在第一个参数中,当您有一个函数在第一个参数中期望某个值时非常方便。我认为这是在“严格模式”中抛出了一个错误。如果您有问题,请使用
    Array.prototype.push.call(参数'bar')
    。我认为这是一种黑客行为,但事实并非如此。文档中写道:“push是故意泛型的。这个方法可以与call()或apply()一起用于类似数组的对象。push方法依赖于length属性来确定从何处开始插入给定值。”奇怪的是,只需将参数赋值给
    参数,比如
    参数[arguments.length]=“bar”
    ,看起来可以工作,但是如果通过
    apply()
    将该
    参数
    值传递给另一个函数,则添加的参数不会传递给该函数。它只接收原始参数。“您不能直接更改参数数组。”当然可以。应该注意的是,尽管您可以像这样修改参数。因此,如果在一个经常被调用的函数中像这样处理参数,可能会影响性能。
    var args = [...arguments];
    
    var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
    
    function first(parameter1, parameter2) {
    
      var parameter3 = "123";
    
      secondFunction.call(
        this,
        parameter1,
        parameter2,
        parameter3);
    },
    
    // 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;