javascript - 哈希表是如何在 JavaScript 中实现的

标签 javascript hash

一些语言实现了哈希表,它可以使用任何东西作为键,而不仅仅是字符串。在 JavaScript 中,您只能使用字符串和数字。这种实现的查找还是O(1)吗?有 JavaScript 的实现吗?

最佳答案

关于这个主题显然存在很多误解。在 JavaScript 中,对象的键实际上只是字符串(参见 §8.10 )。 任何 用作对象键的内容(包括数字)都将转换为字符串。因此,obj[1]obj["1"] 是等价的

在内部,许多 JS 实现使用某种哈希表来快速查找对象属性。 V8 实际上 generates hidden C++ classes允许查找在单个 CPU 指令中执行。无论哪种方式,都可以安全地假设对象属性访问很快并且接近 O(1)。

由于所有对象属性键都被转换为字符串,您只能使用转换为字符串的事物作为键。由于数字自然会转换为字符串,因此它们工作正常。 bool 值也一样。日期也有效,因为 Date 实例会转换为唯一的字符串(尽管需要注意一些边缘情况)。

但是,对象不会转换为有意义的字符串。例如:

var o = {};
o[{a:1}]='some value';

实际结果:

o = { '[object Object]': 'some value' }

因为 string conversion rules .由于每个对象都会转换为 [object Object],因此将许多对象作为键添加到另一个对象将导致一个对象只有一个属性。

当然,仍然可以使用对象作为键。您只需覆盖 toString 的默认实现 — 实际上,创建您自己的哈希算法。例如,

function ComplexKey(a,b) {
    this.a = a;
    this.b = b;
}

ComplexKey.prototype.toString = function() {
    return this.a + ':' + this.b;
}

var o = {};
o[new ComplexKey(1,2)] = 'x';
o[new ComplexKey(3,4)] = 'y';

结果:

o = {
    '1:2': 'x',
    '3:4': 'y'
}

关于javascript - 哈希表是如何在 JavaScript 中实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12238893/

相关文章:

javascript - 如何解决gmail smtp host的smtpjs错误

javascript - Disqus 通用代码无法使用新的 disqus_identifier

javascript - 如何在 JavaScript 中使用 charAt 检查一个值

iis - 如何在 IIS 中查找加密和哈希算法信息?

data-structures - 哈希表是如何工作的?

java - 如何使用 SHA-256 对字符串进行哈希处理

javascript - 将对象数组转换为一个对象

javascript - TSC:--target ES3 兼容性标志有什么作用?

使用前进/后退按钮支持添加 URL 值的 jQuery 最佳实践

PHP 和 URL 的哈希/片段部分