# setmap ## 选择 1. 下面哪个不是set的方法 A.add B.delete C.has D.get 答案 D 2. 下面代码执行的结果为 ``` let set = new Set([1, 2, 3, 4, 4]); set.add(5) set.add(6) set.add(5) console.log(set.size) ``` A.8 B.5 C.6 D. 4 答案 C 3. 下面代码执行的结果为 ``` let set = new Set([1, 2, 3, 4, 4]); set.set(5) set.add(6) set.add(5) console.log(set.size) ``` A.报错 B.5 C.6 D. 4 答案 A 4. 下面代码执行的结果为 ``` var mySet = new Set([1, 2, 3, 4, 4]); console.log([...mySet]); ``` A.[1, 2, 3, 4, 4] B.[1, 2, 3, 4] C.[[1, 2, 3, 4, 4]] D.[] 答案 B 5. 下面代码的执行结果为 ``` var myMap = new Map(); var keyObj = {}, myMap.set(keyObj, "和键 keyObj 关联的值"); console.log(myMap.get(keyObj)); console.log(myMap.get({})); ``` A."和键 keyObj 关联的值" {} B.报错 什么都不出 C.undefined null D."和键 keyObj 关联的值" undefined 答案 D 解析 因为 keyObj !== {} 6. 下面代码的执行结果为 ``` var myMap = new Map(); var keyFunc = function () {}, // 函数 myMap.set(keyFunc, "和键 keyFunc 关联的值"); console.log(myMap.get(keyFunc)); // "和键 keyFunc 关联的值" console.log(myMap.get(function() {})) // undefined, 因为 keyFunc !== function () {} ``` A."和键 keyFunc 关联的值" "和键 keyFunc 关联的值" B.报错 什么也不出 C."和键keyFunc 关联的值" undefined D.undefined undefined 答案 C 7. 下面代码的执行结果为 ``` var myMap = new Map(); myMap.set(NaN, "not a number"); console.log(myMap.get(NaN)); // "not a number" var otherNaN = Number("foo"); console.log(myMap.get(otherNaN)); // "not a number" ``` A. 8. ## 填空 1. 下面代码执行后 size的值打印出来是 ``` let s = new Set(); s.add([1]); s.add([1]); console.log(s.size); ``` 答案 2 解析: 这个问题类似于问这个: let a = [1]; let b = [1]; console.log(a === b); // false 简单的说就是a和b是两个数组,两个引用对象,怎么可能相等呢?所以对于set来说,这俩不重复,所以是2! 1. 下面代码执行后 con的值打印出来是 答案 undefined 解析 因为set的时候用的数组[1]和get的时候用的数组[1]是分别两个不同的数组,只不过它们元素都是1。它们是分别定义的两个数组,并不是同一个值。 ``` let map = new Map(); map.set([1],"ES6系列"); let con = map.get([1]); console.log(con); ``` 3. 用 声明一个set结构 答案 new Set 4. 通过 可以实现对set结构中元素的遍历 答案 for of foreach 4. 下面代码执行的结果为 ``` var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]); var second = new Map([[1, 'uno'], [2, 'dos']]); var merged = new Map([...first, ...second]); console.log(merged) ``` 答案 { 1 → "uno", 2 → "dos", 3 → "three" } 解析 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的,对应值即 uno,dos, three 4. 下面代码执行的结果为 ``` var myMap = new Map(); var keyString = "a string"; myMap.set(keyString, "和键'a string'关联的值"); var jieguo = myMap.get(keyString); // "和键'a string'关联的值" var jieguo1 = myMap.get("a string"); console.log(jieguo,jieguo1) ``` 答案 和键'a string'关联的值 和键'a string'关联的值 map 遍历生成函数及其作用 答案 Map.prototype.keys():返回键名的遍历器。 Map.prototype.values():返回键值的遍历器。 Map.prototype.entries():返回所有成员的遍历器。 Map.prototype.forEach():遍历 Map 的所有成员。 ## 简答题 1. maps和objects的区别 答案 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。 Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。 Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。 Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。 2. WeakSet和Set的区别 答案 WeakSet的成员只能是对象,而不能是其他类型的值 WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。 3. set 和 map的区别 答案 Set是一种类似数组的集合类型,它与数组不同的是,不允许存在重复数据;常用操作方法有:add,delete,has,clear等;遍历使用forEach; Map是一种类似对象的集合类型,它与对象不同的是,key可以接受对象类型,常用的操作方法有:set,get,has,delete等;遍历使用forEach 4. 定义一个函数 将传入的数组元素去重后返回(可以写多种方法) 详见 https://segmentfault.com/a/1190000016418021?utm_source=tag- 5. 用 foreach 和 for of 分别遍历下面这个set var myMap=new Map() myMap.set(0, "zero"); myMap.set(1, "one"); var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]); var second = new Map([[1, 'uno'], [2, 'dos']]); var merged = new Map([...first, ...second]); 6.module、import