/** * 接受一个可迭代的参数 * @param {*} iterable * 正确格式为[[key,value],[key,value]] */const Mymap = (() => { // 设置私有属性 const getObj = Symbol('getObj') const arrKey = Symbol('arrKey') const isEqual = Symbol('isEqual') return class Mymap { /** * 接受一个可迭代的参数 * @param {*} iterable * 正确格式为[[key,value],[key,value]] */ constructor(iterable = []) { this[arrKey] = [] // 判断格式是否真确 // 正确格式为[[key,value],[key,value]] if (typeof iterable[Symbol.iterator] !== 'function') { throw new TypeError(`${iterable} is not an iterator`) } for (const item of iterable) { //数组内的格式是否正确 // 正确格式为[[key,value],[key,value]] if (typeof item[Symbol.iterator] !== 'function') { throw new TypeError(`${item} is not iterator`) } // 将其key与value 值迭代出来 const iterator = item[Symbol.iterator]() const key = iterator.next().value; const value = iterator.next().value; this.set(key, value) } } /** * 写入key 与 value * 当其key重复时 当前key的value会覆盖之前value * 若是新key 则添加 * @param {*} key * @param {*} value */ set(key, value) { const obj = this[getObj](key) if (obj) { obj.value = value } else { this[arrKey].push({ key, value }) } } /** * 查看是否拥有某个key值 * @param {*} key * 返回值为 true or false */ has(key) { return this[getObj](key) !== undefined; } /** * 查看某个一key值得value * @param {*} key * 返回值为 value or false */ get(key) { const obj = this[getObj](key); return obj !== undefined ? obj.value : false } /** * 删除某一个key * @param {*} key * 返回值为 true or false */ delete(key) { for (let i = 0; i < this[arrKey].length; i++) { let obj = this[arrKey][i] if (obj.key === key) { this[arrKey].splice(i, 1) return true; } } return false; } /** * 清空 */ clear() { this[arrKey].length = 0; } /** * 遍历 * 与Array的forEach有区别 * 第一项的值为 value * 第二项的值为 key * 第三项的值为 this * @param {*} callback */ forEach(callback) { for (const { key, value } of this[arrKey]) { callback(value, key, this) } } /** * 获取键值对的数量 与Array的length 一样 */ get size() { return this[arrKey].length; } /** * 使其成为可迭代对象 */ *[Symbol.iterator]() { for (const { key, value } of this[arrKey]) { yield [key, value] } } /** * 检索key值 * @param {*} key */ [getObj](key) { for (const item of this[arrKey]) { if (this[isEqual](key, item.key)) { return item; } } // return false; } /** * 判断两个key值是否相等 * @param {*} key1 * @param {*} key2 */ [isEqual](key1, key2) { if (key1 === 0 && key2 === 0) { return true; } return Object.is(key1, key2) } }})()