一些语言实现了哈希表,它可以使用任何东西作为键,而不仅仅是字符串。在JavaScript中,您只能使用字符串和数字。这种实现的查找仍然是O(1)吗?在JavaScript中有实现吗?
发布于 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实例会转换为唯一的字符串(尽管有一些边缘情况需要注意)。
但是,对象不会转换为有意义的字符串。例如:
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'
}发布于 2012-09-03 03:21:22
JavaScript没有“哈希表”。
它有Dictionaries,它是键/值对的集合,有一个键必须是唯一的限制。不同之处在于,尽管出于性能原因,实现很可能会在内部使用Hash table,但字典的实现并不意味着哈希。
JavaScript中的所有对象都作为字典运行(这排除了诸如string和number之类的基元类型)。一般情况下,空对象用于通用的“哈希表”:
var o = {};
o[propExpression] = valueExpression;然而,这里有一件很重要的事情:所有属性/键值首先被转换成字符串。
因此,以下内容是相同的:
o[true] = 1
o["true"] = 1在Property Descriptors中可以找到“知道”属性名称都是字符串的关键部分,这让人有点困惑
属性标识符类型用于将属性名称与属性描述符相关联。属性标识符类型的值是形式(名称,描述符)的对,其中名称是字符串,描述符是属性描述符值。
https://stackoverflow.com/questions/12238893
复制相似问题