如何将新参数推送到javascript';s参数对象

如何将新参数推送到javascript';s参数对象,javascript,arrays,object,arguments,Javascript,Arrays,Object,Arguments,有一个奇怪的例子,javascript arguments对象被严重依赖。我已经“解决”了这个问题,但想知道是否有人能向我解释一下此代码导致的一些行为: function whatweget(arg1,arg2,arg3) { while(arguments.length<3) { arguments[arguments.length++] = undefined; } console.log(arguments); } function argstest() {

有一个奇怪的例子,javascript arguments对象被严重依赖。我已经“解决”了这个问题,但想知道是否有人能向我解释一下此代码导致的一些行为:

function whatweget(arg1,arg2,arg3) {
    while(arguments.length<3) { arguments[arguments.length++] = undefined; }
    console.log(arguments);
}
function argstest() {
    arguments[arguments.length++] = 3;
    console.log(arguments);
}
whatweget(1,2);
whatweget(1,2,3);
whatweget(1,2,3,4);
argstest(3);
在whatweget console.log上检查arguments对象时,显示它有20项,前3项用粗体显示,后17项稍微褪色。检查argstest console.log中的参数这些“ghost”参数不会显示。这不是一个问题,因为后续脚本将被传递“参数”,并使用正确设置的“长度”参数,但我想知道是否有人了解这种行为


哦,顺便说一句,Firefox8对这种行为非常酷。它按预期完成了所有操作,只是它没有在Watch inspector中显示arguments对象,不过当您将鼠标悬停在该对象上时,它会将其显示为数组。糟糕的Firefox,糟糕的Firefox。

如果您在开发人员控制台中进行测试,我认为这是一个控制台显示错误

如果在arguments对象上执行for-in以枚举其所有属性,则只能得到预期的3个属性

function whatweget(arg1,arg2,arg3) {
    while(arguments.length<3) { arguments[arguments.length++] = undefined; }
    for( var n in arguments ) console.log(n, arguments[n]);
}

0 1
1 2
2 undefined

arguments
对象不是数组,尽管它的行为有点像数组。我认为在尝试将另一个元素推送到数组之前需要将其转换为数组。我认识到这一点,这就是为什么我在[I]处设置arguments object=undefined的参数(类似于执行arguments.I=undefined),而不是执行arguments.push(undefined)。我还通过arguments.length++手动更新.length参数。添加信息:如预期的那样,当传递2个参数时,调试器只通过whatweget循环一次。那么这些重影值是从哪里添加的呢?@Teddy:您可以修改arguments对象的属性以及它的length属性。你也可以添加新的。这是一个很好的附加信息来源:我自己的测试证实了你的。似乎如果您正常处理异常参数对象,则不存在重影未定义项。看起来是个Chrome bug。谢谢你和我一起调查!
function whatweget(arg1,arg2,arg3) {
    while(arguments.length<3) { arguments[arguments.length++] = undefined; }
    for( var n in arguments ) console.log(n, arguments[n]);
}

0 1
1 2
2 undefined
function whatweget(arg1,arg2,arg3) {
    while(arguments.length<3) { arguments[arguments.length++] = undefined; }
    return arguments;
}

var args = whatweget(1,2);

console.log( '2' in args );  is true
console.log( '5' in args );  is false