首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >哈希表是如何在JavaScript中实现的

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

Stack Overflow用户
提问于 2012-09-03 03:05:37
回答 2查看 3K关注 0票数 2

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

EN

Stack Overflow用户

回答已采纳

发布于 2012-09-03 03:58:26

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

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

由于所有对象属性键都被转换为字符串,因此您只能使用转换为字符串的内容作为键。因为数字会自然地转换为字符串,所以它们工作得很好。布尔值也是如此。日期也是有效的,因为Date实例会转换为唯一的字符串(尽管有一些边缘情况需要注意)。

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

代码语言:javascript
运行
复制
var o = {};
o[{a:1}]='some value';

实际结果是:

代码语言:javascript
运行
复制
o = { '[object Object]': 'some value' }

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

当然,仍然可以使用对象作为键。你只需要覆盖toString的默认实现--实际上就是创建你自己的散列算法。例如,

代码语言:javascript
运行
复制
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';

结果如下:

代码语言:javascript
运行
复制
o = {
    '1:2': 'x',
    '3:4': 'y'
}
票数 14
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12238893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档