Rhino不会枚举函数的“参数”

时间:2011-08-10 05:26:59

标签: javascript linux rhino jvm-arguments enumerate

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

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

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

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

1 个答案:

答案 0 :(得分:1)

来自Javascript for..in looping over arguments ie.for( arg in arguments) does not work in IE8 but it works in Chrome 8

  

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

     

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

     

首先让我们关注所有 - 我的意思是说,不仅仅是对象本身的属性,还有潜在的属性,表示对象继承自其原型或原型的原型,等等。出于这个原因,我们经常建议您通过使用条件if(obj.hasOwnProperty(p))立即另外限定它来“保护”任何... in循环(假设您的循环是为了写入的(var p in obj) ))。

     

但这不是你在这里遇到的。为此,让我们关注第二个词,可枚举。 JavaScript中对象的所有属性都是可枚举的或不可枚举的,这与属性是否出现在for ... in循环中非常直接相关。在诸如Firefox和IE之类的浏览器中,事实证明,arguments对象的数字属性是不可枚举的(也不是它的长度),这正是你没有迭代任何东西的原因!