【发布时间】: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:您可以修改参数对象的属性,以及它的长度属性。您也可以添加新的。
标签: javascript arrays object arguments