相关疑难解决方法(0)

ES6是否为对象属性引入了明确定义的枚举顺序?

ES6是否为对象属性引入了明确定义的枚举顺序?

var o = {
  '1': 1,
  'a': 2,
  'b': 3
}

Object.keys(o); // ["1", "a", "b"] - is this ordering guaranteed by ES6?

for(let k in o) {
  console.log(k);
} // 1 2 3 - is this ordering guaranteed by ES6?
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-6

50
推荐指数
3
解决办法
1万
查看次数

Javascript 中的排序属性被破坏

我需要遍历一个 JavaScript 对象,将其视为带有自定义键的数组。我知道这不是完全支持的,因为属性没有内在顺序,但由于我总是重新排序属性,我发现这种方法简单可靠......直到现在。

当键是数字或可以转换为数字的字符串时,就会出现问题。

当我运行此代码时:

var test1 = {4294966222:"A",4294966333:"A",4294966111:"A"};
var test2 = {4294968222:"A",4294968333:"A",4294968111:"A"};
        
for (var k in test1) {console.log(k);}
console.log("---");
for (var k in test2) {console.log(k);}
Run Code Online (Sandbox Code Playgroud)

输出是:

4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Run Code Online (Sandbox Code Playgroud)

意思是:

  • (test1) 如果keys低于2^32 (4,294,967,296),它们会自动重新排序,最小的在前
  • (test2) 如果键大于 2^32,它们不会被重新排序。

问题是:为什么会发生这种情况?

由于我测试的所有浏览器(Google Chrome 79.0、Mozilla Firefox 71.0、Microsoft Edge 44.18362、Internet Explorer 11.535)都同意此输出,因此必须有一些官方规范。

更新

在发现这是一个门槛问题之前,我测试了很多数字。我发现奇怪的是,序列 2,3,1 的行为与以相同方式排序的三个时间戳不同。

javascript

15
推荐指数
1
解决办法
218
查看次数

我应该如何以索引顺序迭代稀疏数组?

我有一个稀疏数组,其内容不保证以索引顺序插入,但需要按索引顺序迭代.要遍历稀疏数组,我了解您需要使用for..in语句.

但是,根据这篇文章:

无法保证for ... in将以任何特定顺序返回索引

但是像这样的stackoverflow问题表明虽然对象属性订单不能保证,但是数组顺序是:

在JavaScript中不保证对象中的属性顺序,您需要使用数组.

我在Chrome,Firefox和IE的最新版本中对此进行了测试.

<ol id="items"></ol>
Run Code Online (Sandbox Code Playgroud)
var list = [];

function addItem(index) {
    list[index] = { idx : index };
}

var insertOrder = [ 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 ];

for ( var i = 0; i < 15; i++ ) {
    addItem(insertOrder[i]);
}

for(var item in list) {
    $("#items").append("<li>" + list[item].idx + "</li>");
}
Run Code Online (Sandbox Code Playgroud)

所有人似乎都遵守索引顺序,所以我可以相信这总是如此吗?否则,我如何以索引顺序最好地获取它们?

javascript arrays sparse-array

7
推荐指数
1
解决办法
1793
查看次数

标签 统计

javascript ×3

arrays ×1

ecmascript-6 ×1

sparse-array ×1