docs: function (key) {
                  var map = this._getMap(key, false);
                  if (map == null) {
                      return undefined;
                  }
                  var item;
                  if (map == this._objectKeys) {
                      item = key[this._metaDataName];
                      if (item) {
                          key[this._metaDataName] = item.next;
                          if (!item.next) {
                              delete key[this._metaDataName];
                          }
                      }
                  } else if (map != this._otherKeys) {
                      item = map[key];
                  } else {
                      for (var i in map) {
                          if (map.hasOwnProperty(i)) {
                              var elt = map[i];
                              if (key === elt.key) {
                                  item = elt;
                                  break;
                              }
                          }
                      }
                  }
                  if (item) {
                      var next = item.next;
                      map[item.index] = next;
                      if (!next) {
                          delete map[item.index];
                      }
                      item.key = null;
                      item.next = null;
                      return item.value;
                  } else {
                      return undefined;
                  }
              }