Set

Set是什么

  1. // 1.什么是 Set
  2. // 集合
  3. // [1, 2];
  4. // 数组是一系列有序的数据集合
  5. // Set 是一系列无序、没有重复值的数据集合
  6. // 2.理解 Set
  7. // console.log([1, 2, 1]);
  8. // console.log(new Array(1, 2, 1));
  9. const s = new Set();
  10. s.add(1);
  11. s.add(2);
  12. // // Set 中不能有重复的成员
  13. s.add(1);
  14. console.log(s);
  15. // Set 没有下标去标示每一个值,所以 Set 是无序的,也不能像数组那样通过下标去访问 Set 的成员

Set实例的方法和属性

  1. // 1.方法
  2. // add
  3. const s = new Set();
  4. s.add(1).add(2).add(2);
  5. // console.log(s);
  6. // has
  7. // console.log(s.has(1));
  8. // console.log(s.has(3));
  9. // delete
  10. // s.delete(1);
  11. // // 使用 delete 删除不存在的成员,什么都不会发生,也不会报错
  12. // s.delete(3);
  13. // console.log(s);
  14. // clear
  15. // s.clear();
  16. // console.log(s);
  17. // forEach
  18. // s.forEach(function (value, key, set) {
  19. // // Set 中 value = key
  20. // // console.log(value, key, set === s);
  21. // // console.log(this);
  22. // }, document);
  23. // console.log(s);
  24. // 按照成员添加进集合的顺序遍历
  25. // 2.属性
  26. // size
  27. console.log(s.size);
  28. console.log(s);

Set构造函数的参数

  1. // 1.数组
  2. // const s = new Set([1, 2, 1]);
  3. // console.log(s);
  4. // 2.字符串、arguments、NodeList、Set 等
  5. // console.log(new Set('hi'));
  6. // function func() {
  7. // console.log(new Set(arguments));
  8. // }
  9. // func(1, 2, 1);
  10. console.log(new Set(document.querySelectorAll('p')));
  11. const s = new Set([1, 2, 1]);
  12. console.log(new Set(s) === s);
  13. console.log(s);

Set的注意事项

  1. // 1.判断重复的方式
  2. // const s = new Set([1, 2, 1]);
  3. // const s = new Set([NaN, 2, NaN]);
  4. // console.log(1 === 1);
  5. // console.log(NaN === NaN);
  6. // Set 对重复值的判断基本遵循严格相等(===)
  7. // 但是对于 NaN 的判断与 === 不同,Set 中 NaN 等于 NaN
  8. // console.log(s);
  9. // const s = new Set();
  10. // s.add({}).add({});
  11. // console.log({} === {});
  12. // console.log(s);
  13. // 2.什么时候使用 Set
  14. // ① 数组或字符串去重时
  15. // ② 不需要通过下标访问,只需要遍历时
  16. // ③ 为了使用 Set 提供的方法和属性时(add delete clear has forEach size 等)

Set的应用

  1. // 1.数组去重
  2. // [1, 2, 1];
  3. // const s = new Set([1, 2, 1]);
  4. // console.log(s);
  5. // s.forEach
  6. // console.log(...s);
  7. // console.log([...s]);
  8. // console.log([...new Set([1, 2, 1])]);
  9. // 2.字符串去重
  10. // 'abbacbd';
  11. // const s = new Set('abbacbd');
  12. // console.log([...s].join(''));
  13. // console.log(s);
  14. // console.log([...new Set('abbacbd')].join(''));
  15. // 3.存放 DOM 元素
  16. // console.log(document.querySelectorAll('p'));
  17. // for()
  18. const s = new Set(document.querySelectorAll('p'));
  19. console.log(s);
  20. s.forEach(function (elem) {
  21. // console.log(elem);
  22. elem.style.color = 'red';
  23. elem.style.backgroundColor = 'yellow';
  24. });

Map

Map是什么

  1. // 1.认识 Map
  2. // 映射
  3. // Map 和对象都是键值对的集合
  4. // 键->值,key->value
  5. // const person = {
  6. // name: 'alex',
  7. // age: 18
  8. // };
  9. // const m = new Map();
  10. // m.set('name', 'alex');
  11. // m.set('age', 18);
  12. // console.log(m);
  13. // 2.Map 和对象的区别
  14. // 对象一般用字符串当作键
  15. // const obj = {
  16. // name: 'alex',
  17. // true: 'true',
  18. // [{}]: 'object'
  19. // };
  20. // console.log(obj);
  21. // console.log({}.toString());
  22. // 基本数据类型:数字、字符串、布尔值、undefined、null
  23. // 引用数据类型:对象([]、{}、函数、Set、Map 等)
  24. // 以上都可以作为 Map 的键
  25. const m = new Map();
  26. m.set('name', 'alex');
  27. m.set(true, 'true');
  28. m.set({}, 'object');
  29. m.set(new Set([1, 2]), 'set');
  30. m.set(undefined, 'undefined');
  31. console.log(m);

Map实例的属性和方法

  1. // 1.方法
  2. // set
  3. const m = new Map();
  4. // 使用 set 添加的新成员,键如果已经存在,后添加的键值对覆盖已有的
  5. m.set('age', 18).set(true, 'true').set('age', 20);
  6. // console.log(m);
  7. // set get
  8. // add
  9. // get
  10. // console.log(m);
  11. // console.log(m.get('age'));
  12. // // get 获取不存在的成员,返回 undefined
  13. // console.log(m.get('true'));
  14. // console.log(m.get(true));
  15. // has
  16. // console.log(m.has('age'));
  17. // console.log(m.has('true'));
  18. // delete
  19. // m.delete('age');
  20. // m.delete('name');
  21. // // 使用 delete 删除不存在的成员,什么都不会发生,也不会报错
  22. // console.log(m);
  23. // clear
  24. // m.clear();
  25. // console.log(m);
  26. // forEach
  27. // m.forEach(function (value, key, map) {
  28. // // console.log(value, key, map === m);
  29. // console.log(this);
  30. // }, document);
  31. // 2.属性
  32. // size
  33. // 对象没有类似的属性
  34. console.log(m.size);

Map构造函数的参数

  1. // 1.数组
  2. // console.log(new Map(['name', 'alex', 'age', 18]));
  3. // 只能传二维数组,而且必须体现出键和值
  4. // console.log(
  5. // new Map([
  6. // ['name', 'alex'],
  7. // ['age', 18]
  8. // ])
  9. // );
  10. // 2.Set、Map 等
  11. // Set
  12. // Set 中也必须体现出键和值
  13. const s = new Set([
  14. ['name', 'alex'],
  15. ['age', 18]
  16. ]);
  17. console.log(new Map(s));
  18. console.log(s);
  19. // Map
  20. // 复制了一个新的 Map
  21. const m1 = new Map([
  22. ['name', 'alex'],
  23. ['age', 18]
  24. ]);
  25. console.log(m1);
  26. const m2 = new Map(m1);
  27. console.log(m2, m2 === m1);

Map的注意事项

  1. // 1.判断键名是否相同的方式
  2. // 基本遵循严格相等(===)
  3. // 例外就是 NaN,Map 中 NaN 也是等于 NaN
  4. console.log(NaN === NaN);
  5. const m = new Map();
  6. m.set(NaN, 1).set(NaN, 2);
  7. console.log(m);
  8. // 2.什么时候使用 Map
  9. // 如果只是需要 key -> value 的结构,或者需要字符串以外的值做键,使用 Map 更合适
  10. // forEach for in
  11. // size
  12. // 只有模拟现实世界的实体时,才使用对象
  13. const person = {};

Map的应用

  1. const [p1, p2, p3] = document.querySelectorAll('p');
  2. // console.log(p1, p2, p3);
  3. // const m = new Map();
  4. // m.set(p1, 'red');
  5. // m.set(p2, 'green');
  6. // m.set(p3, 'blue');
  7. const m = new Map([
  8. [
  9. p1,
  10. {
  11. color: 'red',
  12. backgroundColor: 'yellow',
  13. fontSize: '40px'
  14. }
  15. ],
  16. [
  17. p2,
  18. {
  19. color: 'green',
  20. backgroundColor: 'pink',
  21. fontSize: '40px'
  22. }
  23. ],
  24. [
  25. p3,
  26. {
  27. color: 'blue',
  28. backgroundColor: 'orange',
  29. fontSize: '40px'
  30. }
  31. ]
  32. ]);
  33. m.forEach((propObj, elem) => {
  34. for (const p in propObj) {
  35. elem.style[p] = propObj[p];
  36. }
  37. });
  38. // m.forEach((color, elem) => {
  39. // elem.style.color = color;
  40. // });
  41. console.log(m);