2011-07-15 71 views
1

我的一位同事在mongo mapreduce中创建了一个愚蠢的bug,他应该创建了一个对象,但实际上已经传递了字符串"{}"。奇怪的事情是剧本没有崩溃,但实际上遍历字符串,所以我做了一些调查,发现如下:javascript for loop

x="bla"; for (i in x) { alert(i); };不同的浏览器的工作方式如下脚本:

  • IE( 8): - (无提示)
  • 铬:0 1 2
  • 火狐(较旧的一个):0 1 2 vBlength
  • 火狐5:0 1 2
  • 的MongoDB:0 1 2修剪LTRIM RTRIM

我非常清楚地知道这不是一个有效的语法,只是纯粹的好奇心,没有任何人知道为什么浏览器的行为,他们做的方式?我对MongoDB的行为特别感兴趣。

回答

5

实际上,这是完全有效的语法。

在JavaScript中使用for ... in循环不仅会循环数组,还会循环使用属性(我只是一个索引,而不是数组中的实际值)。

退房在Mozilla开发者网络的文档:

for...in - MDN Docs

他们的榜样应该做的事情更加清楚。

+0

所以基本上我看到额外的值,因为这些属性不隐藏? –

+0

@yi_H - 很多。您会看到for ... in循环和不同浏览器中字符串对象的实现细节的差异。 –

+0

请参阅Douglas Crockford关于[for statement](http://javascript.crockford.com/code.html#for%20statement)的建议以避免不好的意外。 – Simon