【发布时间】:2020-07-10 13:15:59
【问题描述】:
当像这样创建对象时
let o = {}
o["prop2"] = "val"
o["prop1"] = "val"
属性是按照设置的顺序存储的,因此在获取对象的键 (Object.keys(o)) 时,它们会以 正确 的顺序返回 (["prop2", "prop1"])。这个顺序具有广泛的影响,因为for...in 循环使用它,因此JSON.stringify 也受到它的影响。我想将此行为用于性能优化(例如发送更易于解析的已排序对象)。
但是,当使用数字索引时,这一切都会崩溃。看似相似的物体
let o = {}
o["2"] = "val"
o["1"] = "val"
不确认上述行为。这里Object.keys(o) 返回["1", "2"] :(.
可以通过某种方式避免这种情况吗?没有预先/后修复所有属性?
【问题讨论】:
-
这些是由于 ES 规范。由于历史原因和优化技术(整数访问可以高度优化,因为本机级别的数组访问和 React 等主要库都依赖它)。您可以使用 Map() 或为它们添加前缀,因此它们不是整数。
-
尝试使用
map,它们将保留插入顺序 -
@theblackgigant 地图如果我可以
JSON.stringify他们会很好用 -
无论如何你都必须在以后反序列化它,所以取决于顺序通常是一个坏主意。简短的回答是否定的,你应该避免依赖于关键顺序
-
@MaximilianMairinger 在性能方面,需要真实世界的数据集和上下文才能使其相关。它可以根据从环境到数据集类型和大小到用例的所有因素而有很大差异。如果您对 JS 引擎似乎在做您认为不应该做的额外工作感到困扰,请知道该引擎在处理这些事情方面很可能比您手动做的更优化。内部数据的解析和表示不会是复杂性更高的数量级,并且很可能是相对于您自己的线性或恒定的。
标签: javascript loops object