1

我正在尝试使用函数可用的“参数”变量来枚举传递给函数的参数,在 Javascript 中,使用:

for (var i in arguments){
   ...
}

这似乎在 chrome 和 firebug 控制台中对我有用,但不适用于 Rhino。使用前两个,我可以成功进入for循环并查看参数,而使用后者,似乎甚至没有进入for循环。

为什么会发生这种情况,我该如何防止这种情况发生?

4

1 回答 1

1

Javascript for..in 循环遍历参数 ie.for(arg in arguments) 在 IE8 中不起作用,但在 Chrome 8 中起作用

首先,虽然函数中可用的参数对象不是数组,但它足够“类似数组”,因此增量 for 循环(for (var i = 0, len = arguments.length; i < len; i++ ) { ... }) 更可取-不仅因为它运行得更快,而且还因为它避免了其他陷阱-其中一个正是您所陷入的。

要真正回答为什么第二个循环不起作用的问题,重要的是要了解 for ... in 循环的作用:它遍历对象中找到的所有可枚举属性。现在,我在该声明中加粗了 2 个词,因为我有目的地使用这两个词来表示一些细微差别,虽然它们可能看起来很微妙,但如果你没有意识到发生了什么,它们会极大地影响你的代码的行为.

首先让我们关注所有——我的意思是说,不仅是对象本身的属性,还包括该对象从其原型或原型的原型等继承的潜在属性。出于这个原因,通常建议您通过立即附加条件 if (obj.hasOwnProperty(p)) 来“保护”任何 for ... in 循环(假设您的循环是为 (var p in obj) 编写的))。

但这不是你在这里遇到的。为此,让我们关注第二个词,可枚举。JavaScript 中对象的所有属性要么是可枚举的,要么是不可枚举的,这几乎直接关系到属性是否出现在 for ... in 循环中。事实证明,在 Firefox 和 IE 等浏览器中,arguments 对象的数字属性是不可枚举的(它的长度也不是),这正是您不遍历任何东西的原因!

于 2011-08-11T06:40:55.620 回答