我似乎只在chrome(而不是IE,FF)中遇到了一个有趣的问题。给出以下对象:
var myObj = {
"59" : "Hello",
"52" : "and",
"50" : "how",
"31" : "are",
"65" : "you"
};
通过for循环遍历此对象按以下顺序吐出内容:
for(var j in myObj) { document.write(myObj[j] +', '); }
are, how, and, hello, you
所有其他主要浏览器都以“正确”顺序提供。 Chrome将键视为整数而不是字符串。问题是我有一个我无法更改的json数据源,我需要按照它们在对象中的顺序访问这些项目。
有人可以建议在Google Chrome中执行此操作吗?
答案 0 :(得分:5)
通过for...in
迭代对象时,不保证属性的顺序。你无能为力:
for...in
循环以任意顺序迭代对象的属性(有关为什么人们不能依赖于迭代的看似有序性的原因,请参阅delete operator,至少在跨浏览器中设置)。
来自delete
页面:
虽然ECMAScript使对象的迭代顺序依赖于实现,但似乎所有主流浏览器都支持基于最先添加的属性的迭代顺序(至少对于不在原型上的属性)。但是,对于Internet Explorer,当在属性上使用delete时,会导致一些令人困惑的行为,从而阻止其他浏览器将对象文字等简单对象用作有序关联数组。在资源管理器中,虽然属性值确实设置为未定义,但如果后来添加了一个具有相同名称的属性,则该属性将在其旧位置迭代 - 而不是在迭代序列的末尾,正如人们可能期望的那样删除了该属性,然后将其添加回来。
因此,如果要在跨浏览器环境中模拟有序关联数组,则必须使用两个单独的数组(一个用于键,另一个用于值),或者构建一个单属性数组对象等。
答案 1 :(得分:4)
如果您想知道为什么会这样,请随时阅读V8问题跟踪器中的长篇讨论“对象属性交互中的错误顺序”: