微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

何时订购对象键

如何解决何时订购对象键

根据我的先验知识,JavaScript 对象基本上是哈希映射(hash table),这意味着 -> set 和 get 在 O(1) 内完成

最近我看到了这篇文章 - https://javascript.info/object 其中指出了以下示例:

let codes = {
"49": "Germany","41": "Switzerland","44": "Great Britain",// ..,"1": "USA"
}

for (let code in codes) {
  console.log(code); // 1,41,44,49
}

和官方 MDN 站点

const anObj = { 100: 'a',2: 'b',7: 'c' };
console.log(Object.entries(anObj)); // [ ['2','b'],['7','c'],['100','a'] ]

我遇到的解释是:

到底发生了什么?

以下是排序规则: 数字先排序,只要 >=0,它们就会从最小到最大排序(更多细节见下文) 字符串排在第二位,它们按插入顺序在自身内部排序 符号排在最后,它们按插入顺序排列(注意我们在这个例子中没有使用符号)

所以我在这里很困惑,我的问题是:

对象键的排序何时发生?

如果对象对键本身进行排序,则意味着插入时间不是 O(1)。 因为每次我插入一个新值时,所有键都应该重新排序。

我认为这种行为可能发生并保持 O(1) 规则的唯一情况是排序仅在显示或使用 Object.keys 函数时发生。

有人知道订购过程是什么时候发生的吗?

解决方法

您正在使用对象字面量来创建地图。这是创建地图的历史方法,因为在过去的 javascript 世界中没有内置的替代方法。

然而,对象字面量和映射在js引擎的最新发展中已经有所不同。 MDN 对此进行了描述:-

虽然现在普通对象的键是有序的,但情况并非总是如此,而且顺序很复杂。因此,最好不要依赖属性顺序。 该顺序最初仅在 ECMAScript 2015 中为自己的属性定义; ECMAScript 2020 也定义了继承属性的顺序。请参阅 OrdinaryOwnPropertyKeys 和 EnumerateObjectProperties 抽象规范操作。但请注意,没有一种机制可以迭代对象的所有属性;各种机制各自包括不同的属性子集。 (for-in 只包括可枚举的字符串键属性;Object.keys 只包括自己的、可枚举的、字符串键的属性;Object.getOwnPropertyNames 包括自己的、字符串键的属性,即使是不可枚举的;Object.getOwnPropertySymbols 只为符号键属性等)

参考:- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

,

基本上在阅读了 v8 文档并查看了@VLAZ 的答案之后,我想我找到了一个不错的答案。 它包含 2 个部分。

首先,就像 VLAZ 提到的,它取决于编译器。 在不同的 js 编译器上实现可能会有所不同。

其次,在 V8 编译器中,排序过程只发生在迭代上,而不发生在存储上。 这意味着,该对象具有“类似字典”的行为,并且不会对 set/get 上的属性进行排序。

当您想要迭代/显示键时。 编译器根据一些规则排列它们并返回键。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。