【问题标题】:How to push a new argument to javascript's arguments object如何将新参数推送到 javascript 的 arguments 对象
【发布时间】:2012-01-09 19:48:13
【问题描述】:

有一个奇怪的案例,即严重依赖 javascript 参数对象。我已经“解决”了问题,但想知道是否有人可以向我解释这段代码导致的一些行为:

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

Chrome 中的输出:

[1, 2, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]
[1, 2, 3]
[1, 2, 3, 4]
[3, 3]

在 whatweget 的 console.log 中检查 arguments 对象显示它有 20 个项目,前 3 个是粗体,而后 17 个是略微褪色的。检查 argstest console.log 中的参数,这些“幽灵”参数不显示。这不是问题,因为后续脚本将传递“参数”并使用正确设置的“长度”参数,但想知道是否有人对此行为有任何见解?

哦,顺便说一句,Firefox 8 非常适合这种行为。它按预期做所有事情,除了它没有在 Watch 检查器中显示参数对象,尽管当你将鼠标悬停在它上面时它会显示为一个数组。糟糕的 Firefox,糟糕的 Firefox。

【问题讨论】:

  • arguments 对象不是一个数组,尽管它有点像一个数组。我认为您需要先将其转换为数组,然后再尝试向其推送另一个元素。
  • 我认识到这一点,这就是为什么我在 [i] 处设置 arguments object = undefined 的参数(类似于做 arguments.i = undefined)而不是做 arguments.push(undefined)。我还通过 arguments.length++ 手动更新了 .length 参数。添加信息:调试器仅在传递 2 个参数时通过 whatweget 循环一次,如预期的那样。那么这些鬼值是从哪里添加的呢?
  • @Teddy:您可以修改参数对象的属性,以及它的长度属性。您也可以添加新的。
  • 这是一个很好的附加信息来源:bonsaiden.github.com/JavaScript-Garden/#function.arguments

标签: javascript arrays object arguments


【解决方案1】:

如果你是在开发者控制台中测试,我认为是控制台显示错误。

如果您对 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 对象,并使用in 测试属性,它显示属性不存在。

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

【讨论】:

  • 我自己的测试证实了你的。似乎如果您正常处理异常参数对象,则不存在幽灵未定义。看起来是一个 Chrome 错误。感谢您与我一起调查!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2021-12-05
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多