我读了一些关于javascript字典实现的问题和答案,但它们不符合我的要求:
所以我想出了在Object.prototype中覆盖“valueOf”方法的想法,如下所示:
Object.__id__ = 0;
Object.prototype.valueOf = function() {
if(!this.__id__)
this.__id__ = ++Object.__id__;
return "__id__" + this.__id__;
}
Object.prototype.toString = Object.prototype.valueOf;
//test
var x = {p1: "5"};
var y = [6];
var z = {};
z[x] = "7";
z[y] = "8";
console.log(z[x], z[y]);
我使用google-chrome进行了测试,它似乎运行良好,但我有点怀疑,这是否会导致一些缺点,因为它很容易实现。
考虑到valueOf方法在整个代码中没有用于其他目的,你认为有任何缺点吗?
答案 0 :(得分:5)
这是一个有趣的想法。我建议我jshashtable。它符合您的第一个要求,但不是第二个要求。我没有看到坚持使用方括号属性访问符号的优点:你对它有特殊要求吗?
使用jshashtable,您可以为Hashtable
构造函数提供散列函数。该函数传递一个要用作键的对象,并且必须返回一个字符串;您可以使用与您所拥有的功能不同的功能,而无需触摸Object.prototype
。
您的想法存在一些缺点:
valueOf
方法将在for...in
循环中显示在任何原生对象上; 答案 1 :(得分:2)
这是一个有趣的问题,因为我到目前为止假设任何对象都可以用作索引(但从未尝试使用关联数组)。我不太了解JavaScript的内部工作原理,但我敢打赌,valueOf在某些地方使用其他,即使不在你的代码中也是如此。您可能会在以后遇到看似无法解释的问题。至少,我将自己局限于一个新的类并保留对象;)或者,你显式调用你的哈希函数,调用它myHash()或其他什么并调用z [x.myHash()]这会增加混乱,但会让我,个人而言,睡得更好;)我无法抗拒地认为有更多的JavaScript感知解决方案,所以考虑所有这些丑陋的解决方法;)
答案 2 :(得分:0)
如果您遇到这个问题,寻找一个JS字典,其中对象是关键字,请查看地图Map vs Object in JavaScript