Object.entries() 时间复杂度

Jam*_*son 2 javascript arrays v8 time-complexity

有谁知道Object.entries()Javascript的复杂性?基于这个问题,我猜想O(n)如果它是通过获取键和值作为数组然后将它们压缩在一起来实现的?

jmr*_*mrk 5

(此处为 V8 开发人员。)

简短回答:是的,Object.entries()在大多数情况下,的复杂度是 O(n)。

对于大对象(数千个属性),它是 O(n log n)。那是因为我们将大对象(以及某些“复杂”的小对象)的属性存储在字典中,而从该字典中检索所有键的复杂度Object.entries()为O(n),被指定为按属性创建顺序返回条目,所以我们必须对它们进行排序,这是一个 O(n log n) 操作。
(这也是如此Object.keys();您链接的问题/答案在这方面是不正确的。)

另外,请记住,由于必须为每个条目分配一个数组,因此Object.entries()在用于大对象时会留下相当多的垃圾。(虽然这并没有改变它的复杂性类。)

还有另一个问题,它可能更相关:检索一个属性的值可能意味着调用一个 getter,这个 getter 真的可以做任何事情,在这种情况下,所有的赌注都没有了。它甚至可能根本不会终止:

var o = {};
Object.defineProperty(o, "there's nothing O(n) about this",
                      {get: () => { while (true); }, enumerable: true});
console.log(Object.entries(o));
Run Code Online (Sandbox Code Playgroud)