因此,假设我在javascript中有以下内容:
object = {"one": 1, "two": 2, "three": 3, "123": 123};
当我迭代这一点时,事实证明“123”成员已跳到列表的前面,而其他成员的顺序则保持不变。如果我做了类似下面的事情,
object = {"one": 1, "two": 2, "three": 3, "123 STRING": 123};
维持订单。所以它看起来像是一个纯粹的数字键,但是包含非数字字符的键不是。谁知道为什么?
答案 0 :(得分:2)
ECMAScript标准中未指定对象中键的顺序。换句话说,您无法保证,密钥可以按任何顺序排列。
您可以查看此帖子:How to keep an Javascript object/array ordered while also maintaining key lookups?
答案 1 :(得分:2)
在V8中,对象背后的数据结构变化很大:
命名属性按插入顺序排列,因为隐藏的类演变/过渡最为自然。
索引属性按其实际值顺序排列,因为存储插入顺序会浪费内存。
如果您受到哈希表的支持,则哈希表会故意伪造与自然结果相同的顺序 优化
在其他浏览器中也是如此,因为存储索引属性,当数字很小时, 在实际的“C阵列”中是一个巨大的优化。可以变化的是索引属性是首先列出还是命名属性。
规范使得这种优化成为可能by not defining iteration order并且V8首先(至少根据那个bug线程)来利用它。
在命名之前列出的索引键(反之亦然)当然是任意的,不会影响任何优化。
答案 2 :(得分:0)
我不是百分百肯定,但可能是因为在迭代按键时没有隐含的顺序,所以你遇到的似乎很奇怪,但它只是一个副作用可能是用于密钥的哈希函数。
Javascript中属性包的实现可能使用一些树状数据结构,其中使用哈希函数存储密钥。
答案 3 :(得分:0)
每当我们遍历一个对象时,我们主要使用for in
for in in itary is itary
。如果顺序很重要,那么你必须更喜欢数组。对于不同的浏览器,顺序是不同的。