1、Set数据结构
答:是ES6新增的一种数据结构,类似于数组,里面的值是唯一不可重复的 Set本身是一个构造函数,需要通过new关键字创建实例,进而生成Set数据结构 let s1 = new Set([1,2,3,4,5]) // 入参为 数组对象 let s2 = new Set() s2.add(1) // 通过add添加Set成员 let s3 = new Set([…document.querySelectorAll(‘div’)]) // 入参为类数组对象
2、Set数据结构特点
答:里面的值都是唯一不可重复的。 故而可以实现数组去重 [new Set(arr)] 或者字符串中字符去重 […new Set(‘abbbs’)].join(‘’); 向Set中添加的值不会进行数据类型的转换,例如传入 5 和 ‘5’,是不同的两个值; Set中添加简单数据类型的值,如果值和类型是一样的,那么会进行去重来保证Set中值的唯一性; Set中添加复合数据类型的值,都是不同的。 let s = new Set() s.add(5); s.add(‘5’); s.size; // 2 数值5和字符串5是不一样的值 s.add({}); s.add({}); s.size; //4 对象和对象都是不一样的 s.add(NaN); s.add(NaN); s.size; //5 两次添加NaN,实际只能添加一个
3、Set实例的属性和方法有哪些
答:属性有:constructor和size;方法有add()、delete()、has()、clear()方法 Set.prototype.constructor 是Set的构造函数,默认就是Set函数 Set.prototype.size 返回Set实例成员的数量 let s = new Set() s.add(1).add(2).add(2) // 添加成员 s.size // 2 获取成员总数量 s.delete(1) // 删除成员 s.has(1) // false 是否包含成员1 s.clear() // 清除所有成员
4、Set结构转为数组的方法
答:使用扩展运算符-------- […new Set([1,2,3])] 使用Array.from()方法 ----------Array.from(new Set([1,2,3])) 使用Set.keys()+ for…of遍历------for (let value of ss.keys()) {} 使用Set.values()+ for…of遍历------for (let value of ss.values()) {} 使用Set.entries() + for…of遍历------for (let [key, value] of ss.entries()) {} 使用forEach遍历 -----------ss.forEach(item => {console.log(item)}) 使用for…of遍历 ---------- for (let value of ss) {}
5、Set的遍历操作有哪些
答:keys() 返回键名的遍历器 values()返回键值的遍历器 entries()返回键值对的遍历器 forEach()遍历 for…of遍历 注意Set构造函数的实例默认可以遍历,遍历器默认就是Set的values()方法。 这就意味着可以省略values方法,直接使用for…of遍历 Set.prototype[Symbol.iterator] === Set.prototype.values
6、如何在利用已有的Set数据结构,生成新的Set数据结构
答:方式1,使用遍历,并在遍历中处理原有Set中的数据 let s1 = [1, 2, 3]; s1 = new Set([…s1].map(val => val*2)) // s1 的值为 2, 4, 6 s1 = new Set([…s1].filter(val => val > 3)) // s1 的值为 4, 6
方式2,使用Array.from() let s2 = [1, 2, 3] s2 = new Set(Array.from(s2, val => val*2)) // s2 的值为 2, 4, 6
7、WeakSet数据结构
答:与Set数据结构类似,不过其成员必须是对象,不能是其他数据类型 varws = new WeakSet(1) // 报错 var ws = new WeakSet(Symbol()) // 报错 var ws = new WeakSet([[1,2], [2,3]]) // 正确 ws.add({}) // 正确
8、WeakSet的特点
答:成员只能是对象 WeakSet中的成员对象都是弱引用,随时可能消失,垃圾回收机制不考虑它里面对象的引用 WeakSet因为对象是弱引用,随时可能小时,所以不可遍历 WeakSet没有size属性,没有forEach遍历,使用时会返回undefined WeakSet有add()、delete()、has()方法
9、垃圾回收机制
答:垃圾回收机制依赖于引用计数。如果一个值的引用次数不为0,垃圾回收机制就不会释放它的内存。 反之引用次数为0,便会释放这个变量的内存,进行回收
10、Set怎么实现交集、并集、差集
答:并集 let res = new Set([…set1, …set2]) 交集 let res = new Set([…set1].filter(val => set2.has(val))) 差集 let res = new Set([…set1].filter(val => !set2.has(val)))
11、Map数据结构
答:是键值对的集合,键可以是各种数据类型。 Map是构造函数,需要通过 new 关键字进行实例化,入参参数可以是一个二维数组 let m = new Map([[0, 111], [false, 2], [‘a’, 3], [NaN, ‘NaN’], [{}, 444]]) m.set(‘aaaa’, 22222)
12、Map和普通对象的区别
答:它们都是键值对的集合,如果添加相同的键,都会将对应的值进行覆盖; 读取到不存在的键,都会返回undefined; 普通对象只能使用字符串来作为对象的键,Map的键可以是任意数据类型; Map的键如果是简单数据类型(数值、字符串、布尔值),那么只要两个键严格相等,就会被视为同一个键; Map的键如果是复合数据类型,那么键是和内存地址绑定在一起的,只要内存地址不一样,就是不同的键。
13、Map实例的属性和方法
答:size属性,用来返回Map结构中成员的数量------ let m = new Map([[1,2], [3,4]]) ; m.size // 3 set(key,value)方法,设置Map结构中key所对应的值-----let m = new Map([[1,2], [3,4]]) ; m.set(111, 222) get(key)方法,获取键对应的值,没有找到则返回undefined-----let m = new Map([[1,2], [3,4]]) ; m.get(1) // 2 has(key)方法,判断某个键是否存在Map数据结构中----------let m = new Map([[1,2], [3,4]]) ; m.has(1) // true delete(key)方法,删除某个键,成功返回true,失败返回false–let m = new Map([[1,2], [3,4]]) ; m.delete(1) // true clear()方法,清除Map数据结构中所有的成员–let m = new Map([[1,2], [3,4]]) ; m.clear()
14、Map的遍历方法
答:keys()方法,获取键名的遍历器 --for (let key of map.keys()) {} values()方法,获取键值的遍历器–for (let value of map.values()) {} entries()方法,获取所有成员的遍历器–for (let [key, value] of map.entries()) {} forEach()方法,遍历所有成员–for (let [key, value] of map){}
15、Map结构转为数组
答:扩展运算符 ----let res = […new Map(arr)] Array.from()方法 — let res = Array.from(new Map(arr))) for…of遍历 for.of遍历 + entries()方法 forEach()遍历
16、WeakMap数据结构及其特点
答:和Map数据结构类似,可以用于生成键值对。 WeakMap是构造函数,需要通过new关键字进行创建实例。 WeakMap的键只能是对象或者null,不可以是其他数据类型。 WeakMap的键名所引用的对象是弱引用,不计入垃圾回收机制,但会自动消除,有助于防止内存泄漏 WeakMap没有size属性,没有遍历操作 let wp = new WeakMap() wp.set(1, 2) // 报错 wp.set({}, 111) // 正确
17、WeakMap的方法有哪些
答:set()方法,用于键及值 get()方法,用于获取键对应的值 delete()方法,用于删除键 clear()方法,用于清除所有成员
18、WeakMap的应用有哪些
答:可以让DOM节点作为键名;当DOM节点删除,就会自动清除WeakMap上的键,防止内存泄漏 可以部署对象或者类的私有内部属性;当对象或者类的实例被删除,对应的内部私有属性也会被删除,防止内存泄漏
19、node中如何查看内存占用情况和手动执行垃圾回收机制
答:首先打开node命令行, node --expose-gc 手动执行垃圾回收,global.gc() 查看内存占用情况,process.memoryUsage()
|