如果我有一个对象循环其属性:
var obj = {a: 1, b: 2, c: 3}
for (var prop in obj){
console.log(obj[prop])
}
我不可避免地会得到:1,2,3因此?它可能取决于什么?其他结果实际上是否真实?
答案 0 :(得分:3)
不,语言中无法保证对象属性中的迭代顺序。
来自the MDN:
for ... in循环迭代一个对象的属性 任意顺序(有关为什么不能执行的更多信息,请参阅删除运算符 取决于迭代的看似有序性,至少在a 跨浏览器设置)
和
尽管ECMAScript生成了对象的迭代顺序 依赖于实现,它可能看起来是所有主流浏览器 支持基于最早添加的属性的迭代顺序 首先(至少对于不在原型上的属性)。但是,在 在Internet Explorer的情况下,当一个人在一个属性上使用delete时,有些人 混淆行为结果,阻止其他浏览器使用 像对象文字这样的简单对象作为有序关联数组。在 资源管理器,而属性值确实设置为undefined(如果有) 后来添加了一个具有相同名称的属性,属性将是 在旧的位置迭代 - 而不是在迭代序列的末尾 在删除该属性然后添加之后,人们可能会发现 它回来了。
因此,如果你想模拟一个有序的关联数组 跨浏览器环境,你被迫要么两个单独使用 数组(一个用于键,另一个用于值),或构建一个 单个属性对象的数组等。
如果您需要保证,则必须使用数组。如果愿意,可以通过对属性键进行排序来构造它。