解决方法:将对象作为键的javascript字典

fis*_*one 11 javascript dictionary hashtable

我读了一些关于javascript字典实现的问题和答案,但它们不符合我的要求:

  • 字典必须能够将对象作为键
  • 这些值必须由[] -operator访问

所以我提出了在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]);
Run Code Online (Sandbox Code Playgroud)

我用google-chrome进行了测试,看起来效果很好,但我有点怀疑,这是否会带来一些弊端,因为它很容易实现.

考虑到valueOf方法在整个代码中没有用于其他目的,您认为有任何缺点吗?

Tim*_*own 5

这是一个有趣的想法.我建议我的jshashtable.它符合您的第一个要求,但不是第二个要求.我真的没有看到坚持使用方括号属性访问符号的优点:你有特殊要求吗?

使用jshashtable,您可以为Hashtable构造函数提供散列函数.该函数传递一个要用作键的对象,并且必须返回一个字符串; 您可以使用与您所拥有的功能不同的功能,而无需触摸Object.prototype.

你的想法有一些缺点:

  1. 您的valueOf方法将显示在for...in任何本机对象的循环中;
  2. 您无法确定哪些键应该被视为相等,这是您可能想要做的事情.相反,所有密钥都将被视为唯一.
  3. 这不适用于宿主对象(即环境提供的对象,例如DOM元素)