我正在尝试使用函数可用的'arguments'变量来枚举传递给函数的参数,在Javascript中使用:
for (var i in arguments){
...
}
这似乎对我和Chrome和firebug控制台起作用,而不适用于Rhino。使用前两个,我可以成功进入for循环并查看参数,而使用后者,看起来似乎甚至没有输入for循环。
为什么会发生这种情况?如何防止这种情况发生?
答案 0 :(得分:1)
首先,虽然函数中可用的参数对象不是数组,但它与“数组类似”足以使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对象的数字属性是不可枚举的(也不是它的长度),这正是你没有迭代任何东西的原因!