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;