为什么javascript中的数字键总是排在一边?

时间:2013-08-09 14:20:15

标签: javascript sorting object properties

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

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

当我迭代这一点时,事实证明“123”成员已跳到列表的前面,而其他成员的顺序则保持不变。如果我做了类似下面的事情,

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

维持订单。所以它看起来像是一个纯粹的数字键,但是包含非数字字符的键不是。谁知道为什么?

4 个答案:

答案 0 :(得分:2)

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

您可以查看此帖子:How to keep an Javascript object/array ordered while also maintaining key lookups?

答案 1 :(得分:2)

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

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

命名属性按插入顺序排列,因为隐藏的类演变/过渡最为自然。

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

如果您受到哈希表的支持,则哈希表会故意伪造与自然结果相同的顺序 优化

在其他浏览器中也是如此,因为存储索引属性,当数字很小时, 在实际的“C阵列”中是一个巨大的优化。可以变化的是索引属性是首先列出还是命名属性。

规范使得这种优化成为可能by not defining iteration order并且V8首先(至少根据那个bug线程)来利用它。

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

答案 2 :(得分:0)

我不是百分百肯定,但可能是因为在迭代按键时没有隐含的顺序,所以你遇到的似乎很奇怪,但它只是一个副作用可能是用于密钥的哈希函数。

Javascript中属性包的实现可能使用一些树状数据结构,其中使用哈希函数存储密钥。

答案 3 :(得分:0)

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

  

for in in itary is itary

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

请参阅以下链接: Elements order in a "for (… in …)" loop