| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | var hasOwnProperty = Object.prototype.hasOwnPropertymodule.exports = PseudoMapfunction PseudoMap (set) {  if (!(this instanceof PseudoMap)) // whyyyyyyy    throw new TypeError("Constructor PseudoMap requires 'new'")  this.clear()  if (set) {    if ((set instanceof PseudoMap) ||        (typeof Map === 'function' && set instanceof Map))      set.forEach(function (value, key) {        this.set(key, value)      }, this)    else if (Array.isArray(set))      set.forEach(function (kv) {        this.set(kv[0], kv[1])      }, this)    else      throw new TypeError('invalid argument')  }}PseudoMap.prototype.forEach = function (fn, thisp) {  thisp = thisp || this  Object.keys(this._data).forEach(function (k) {    if (k !== 'size')      fn.call(thisp, this._data[k].value, this._data[k].key)  }, this)}PseudoMap.prototype.has = function (k) {  return !!find(this._data, k)}PseudoMap.prototype.get = function (k) {  var res = find(this._data, k)  return res && res.value}PseudoMap.prototype.set = function (k, v) {  set(this._data, k, v)}PseudoMap.prototype.delete = function (k) {  var res = find(this._data, k)  if (res) {    delete this._data[res._index]    this._data.size--  }}PseudoMap.prototype.clear = function () {  var data = Object.create(null)  data.size = 0  Object.defineProperty(this, '_data', {    value: data,    enumerable: false,    configurable: true,    writable: false  })}Object.defineProperty(PseudoMap.prototype, 'size', {  get: function () {    return this._data.size  },  set: function (n) {},  enumerable: true,  configurable: true})PseudoMap.prototype.values =PseudoMap.prototype.keys =PseudoMap.prototype.entries = function () {  throw new Error('iterators are not implemented in this version')}// Either identical, or both NaNfunction same (a, b) {  return a === b || a !== a && b !== b}function Entry (k, v, i) {  this.key = k  this.value = v  this._index = i}function find (data, k) {  for (var i = 0, s = '_' + k, key = s;       hasOwnProperty.call(data, key);       key = s + i++) {    if (same(data[key].key, k))      return data[key]  }}function set (data, k, v) {  for (var i = 0, s = '_' + k, key = s;       hasOwnProperty.call(data, key);       key = s + i++) {    if (same(data[key].key, k)) {      data[key].value = v      return    }  }  data.size++  data[key] = new Entry(k, v, key)}
 |