根据Elements order in a "for (… in …)" loop,我知道javascript对象当前没有定义的顺序,但是我的问题是,假设我将同一对象重复2次,例如:
var obj = {
"a":1,
"b":2,
};
for (var i in obj){
//very random order 1
};
//some other code
for (var i in obj){
//very random order 2
};
“非常随机数1”是否总是与“非常随机数2”相同?
答案 0 :(得分:0)
这是一个实现细节,因此除非真正查看了实现,否则您无法确定,然后它可能仍会在浏览器或版本之间发生变化。
但是我的猜测是,如果对象在此期间保持不变,则顺序至少保持不变。原因是存在一些属性字典,只要您不乱动字典,就不会有理由返回不同的顺序。顺序实际上不是随机的,只是没有以任何特定方式正式排序。因此它是不确定的,而不是随机的。
然后,正如您所链接的答案所提到的那样,该行为是明确未定义的,因此请不要依赖它。如果您需要特定的排序,那么就不要依赖未记录的实现细节了。
答案 1 :(得分:0)
密钥应始终以相同的顺序排列,但是如果出现问题,则可以分别获取和/或排序密钥,然后访问数据:
function getOwnKeys(obj) {
return Object
.keys(obj)
.filter(function(a) {
return obj.hasOwnProperty(a);
});
}
var obj = {
b: 2,
a: 1,
c: 3
};
//Classic way
console.log("Classic way");
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
//Getting (and sorting) the keys
console.log("Getting (and sorting) the keys");
var keys = getOwnKeys(obj).sort();
for (var keyIndex = 0; keyIndex < keys.length; keyIndex++) {
var key = keys[keyIndex];
console.log(key, obj[key]);
}
正如fjc在此comment中的评论所指出的那样,this MDN page指定:
for ... in语句以任意顺序遍历对象的可枚举属性。
再往下走:
此循环仅按原始插入顺序记录可迭代对象的可枚举属性。
这当然是Mozilla Firefox的当前实现,因此在其他浏览器甚至是较旧版本的Mozilla Firefox中都可能会有所不同。