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

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

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

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

EN

回答 2

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

Stack Overflow用户

发布于 2012-09-03 03:21:22

JavaScript没有“哈希表”。

它有Dictionaries,它是键/值对的集合,有一个键必须是唯一的限制。不同之处在于,尽管出于性能原因,实现很可能会在内部使用Hash table,但字典的实现并不意味着哈希。

JavaScript中的所有对象都作为字典运行(这排除了诸如stringnumber之类的基元类型)。一般情况下,空对象用于通用的“哈希表”:

代码语言:javascript
运行
复制
var o = {};
o[propExpression] = valueExpression;

然而,这里有一件很重要的事情:所有属性/键值首先被转换成字符串

因此,以下内容是相同的:

代码语言:javascript
运行
复制
o[true] = 1
o["true"] = 1

Property Descriptors中可以找到“知道”属性名称都是字符串的关键部分,这让人有点困惑

属性标识符类型用于将属性名称与属性描述符相关联。属性标识符类型的值是形式(名称,描述符)的对,其中名称是字符串,描述符是属性描述符值。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12238893

复制
相关文章

相似问题

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