59

对于我最近编写的一些算法,我认为散列会很棒。我认为我可能只使用对象中的成员变量作为键值对。我不确定这是否是最佳选择,因为我真的不知道幕后发生了什么。我还认为 V8 的做法与其他环境不同。然而,我确实想象查找成员变量会很快(希望如此)?

综上所述,我想知道在 JavaScript 对象中写入、读取、创建和删除成员变量的运行时复杂度是否都是 O(1)。如果环境存在差异(v8 与其他),它们是什么?

4

3 回答 3

69

是的,它们是哈希。不同浏览器的实现是不同的。尽管许多文章声称对象不是散列,但它们的行为非常像散列,因此可以这样使用。

我必须通过运行性能测试来证明这一点:

阅读这些测试的方法是,当对象的大小增加时,如果 ops/sec 没有性能差异,那么这意味着对象是散列。哈希的定义特征是每个操作的复杂度为 O(1),无论它与其他操作相比更快或更慢。

测试: http:
//jsperf.com/objectsashashes/2(100 键)
http://jsperf.com/objectsashashes/3(100k 键)
http://jsperf.com/objectsashashes/(100 万键)
http:// /jsperf.com/objects-as-hashes-300-mil(10m键)

注意:每个浏览器在不同的操作中更快/更慢。这似乎在版本之间和每年都在变化。

于 2012-09-03T23:31:18.843 回答
13

JavaScript 对象哈希。我无法想象任何不会对对象属性提供恒定时间 CRUD 操作的合理实现。

您是否看到这种方法存在特定的性能问题?

于 2012-09-03T03:41:48.877 回答
-1

JavaScript 中的对象是哈希表的一个示例,因为对象数据表示为键和值。

于 2021-03-20T08:30:20.853 回答