{(……中))多次运行是否获得相同的随机结果?

时间:2018-08-01 09:34:02

标签: javascript for-loop iteration javascript-objects

根据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”相同?

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中都可能会有所不同。