5

因此,假设我在 javascript 中有如下内容:

object = {"one": 1, "two": 2, "three": 3, "123": 123};

当我遍历这个时,原来“123”成员已经跳到了列表的前面,而其他成员的顺序保持不变。但是,如果我执行以下操作,

object = {"one": 1, "two": 2, "three": 3, "123 STRING": 123};

秩序得以维持。所以看起来像一个纯数字键被撞了,但一个包含非数字字符的键不是。有谁知道为什么?

4

4 回答 4

2

ECMAScript 标准中没有指定对象中键的顺序。换句话说,您没有任何保证,密钥可以按任何顺序排列。

您可能会查看这篇文章:如何在保持键查找的同时保持 Javascript 对象/数组有序?

于 2013-08-09T14:24:50.583 回答
2

在 V8 中,对象背后的数据结构变化很大:

  • 对象内命名属性,直接存储在“C 结构”上
  • 对象外命名属性,存储在对象外部的数组中,附加间接
  • 索引属性(属性名称可以转换为整数的属性),存储在对象外部的数组中,但数组索引充当键
  • 有序哈希表

命名属性按插入顺序排列,因为这对于隐藏类演化/转换是最自然的。

索引属性按其实际值顺序排列,因为存储插入顺序会浪费内存。

如果您由哈希表支持,则哈希表会故意伪造与自然优化产生的相同顺序。

在其他浏览器中也是如此,因为当数字很小时,在实际的“C 数组”中存储索引属性是一项巨大的优化。可能会有所不同的是索引属性是首先列出还是命名属性。

规范通过不定义迭代顺序使这种优化成为可能,并且 V8 是第一个(至少根据那个错误线程)利用它。

在命名之前列出索引键,反之亦然,当然是任意的,不会影响任何优化。

于 2013-08-09T14:30:57.417 回答
0

我不是 100% 确定,但这可能是因为在遍历键时没有隐式顺序,所以你所经历的似乎很奇怪,但这可能只是用于键的哈希函数的副作用。

Javascript 中属性包的实现可能使用一些树状数据结构,其中键使用散列函数存储。

于 2013-08-09T14:25:31.180 回答
0

每当我们循环一个对象时,我们主要使用for in

for in 中的迭代是任意的

.如果顺序很重要,那么你必须更喜欢数组。对于不同的浏览器,顺序是不同的。

请参阅以下链接: “for (... in ...)”循环中的元素顺序

于 2013-08-09T14:34:23.327 回答