function defaultToString(item){ // 将键转化为字符串 if(item === null){ return 'NULL' }else if(item === undefined){ return 'UNDEFINED' }else{ return item.toString() } } class valuePair{ // 键值对 constructor(key, value){ this.key = key this.value = value } toString(){ return `[#${this.key}: ${this.value}]` } } class Dictionary{ constructor(toStrFn = defaultToString){ this.toStrFn = toStrFn // 键转化为字符串 this.table = {} } hasKey(key){ return this.table[this.toStrFn[key]] !== undefined } set(key, val){ // 添加新元素 if(key !== null && val !== null){ const strKey = this.toStrFn(key) this.table[strKey] = new valuePair(key, val) return true } return false } remove(key){ if (this.hasKey(key)) { delete this.table[this.toStrFn(key)] return true } return false } get(key){ const value = this.table[this.toStrFn(key)] return value === undefined ? null : value.value } keyValues(){ // 返回所有键值对组成的数组 // Object.values(obj): Returns an array of values of the enumerable properties of an object return Object.values(this.table) } keys(){ // 返回所有键组成的数组 return this.keyValues().map((val) => { return val.key }) } values(){ // 返回所有值组成的数组 return this.keyValues().map((val) => { return val.value }) } forEach(callbackFn){ // 传入一个函数,参数为(key, value),迭代数组中的每个键值对运行 const valuePair = this.keyValues() for(let i=0; i<valuePair.length; i++){ const result = callbackFn(valuePair[i].key, valuePair[i].value) if (result === false) { break // 出错立即停止 } } } size(){ return Object.keys(this.table).length } isEmpty(){ return this.size() === 0 } clear(){ this.table = {} } toString(){ if(this.isEmpty()){ return "" } const valuePairs = this.keyValues() let objString = `${valuePairs[0].toString()}` for(let i=1; i<this.size(); i++){ objString = `${objString},${valuePairs[i].toString()}` } return objString } }
const map = new Map() map.set("a","aa") map.set("b","bb") map.set("c","cc") console.log(map.has("b")) // true console.log(map.size) // 3 // 和我们定义的 Dictionary 类不同,ES2015 的 Map 类的 values 方法和 keys 方法都返回Iterator console.log(map.keys()) // [Map Iterator] { 'a', 'b', 'c' } console.log(map.values()) // [Map Iterator] { 'aa', 'bb', 'cc' } console.log(map.get("c")) // cc map.delete('c') // 删除
// 例: const weakMap = new WeakMap() const obj1 = {"name": "1"} const obj2 = {"name": "2"} const obj3 = {"name": "3"} map.set(obj1, "111") map.set(obj2, "222") map.set(obj3, "333") console.log(map.has(obj1)) // true console.log(map.get(obj3)) // 333 map.delete(obj2) // 删除