JS-2023-03-09笔记总结

101 阅读4分钟

什么是Set

Set 是一系列无序、没有重复值的数据集合

Set 实例的方法和属性

1.方法

  • add()
  • has()
  • delete()
  • clear()
  • forEach()

2.属性

  • size

Set构造函数的参数

  1. 数组
const s = new Set([1, 2, 1]);
console.log(s);
  1. 字符串、arguments、Nodelist、Set等
console.log(new Set("hello"));
function fun() {
 console.log(new Set(arguments));
}
fun(1, 2, 3, 4);
console.log(new Set(document.querySelectorAll("p")));
const s = new Set([1, 2, 1]);
console.log(new Set(s));
console.log(s);

Set的注意事项

1.判断重复的方式

Set对重复值的判断基本遵循严格相等 (===)
但是对于NaN的判断与 === 不同,SetNaN 等于 NaN
console.log(1 === 1);
console.log(NaN === NaN);
const s = new Set([NaN, 1, NaN]);
console.log(s);
const s = new Set();
s.add({}).add({});
console.log({} === {});
console.log(s);

2.什么时候使用Set

① 数组或字符串去重时
const arr = [1, 1, 2, 3, 4, 4, 5];
const s = new Set(arr);
const str = "aaabbbbccccddd";
const s = new Set(str);
console.log(s);
② 不需要通过下标访问,只需要遍历时
③ 为了使用 Set 提供的方法和属性时(add delete clear has forEach size等)

Set的应用

1.数组去重

const s = new Set([1, 2, 1]);
console.log(s);
const result = [];

2.字符串去重

const s = new Set("aaabbbcccddd");
console.log([...s].join(""));
console.log([...new Set("aaabbbcccddd")].join(""));

3.存放 DOM 元素

const s = new Set(document.querySelectorAll("p"));
s.forEach(function (ele) {
    ele.style.color = "blue";
    ele.style.backgroundColor = "red";
});

Map是什么

1.Map是什么

      // 映射
      // Map 和 对象都是键值对的集合

      // 键 -> 值,key -> value
      //   const person = {
      //     name: "xiaoming",
      //     age: 18,
      //   };
      //   console.log(person);

      //   const m = new Map();
      //   m.set("name", "alex");
      //   m.set("age", 18);
      //   console.log(m);

2.Map和对象的区别

  // 对象一般用字符串当做键
  //   const obj = {
  //     name: "alex",
  //     true: "true",
  //     [{}]: "object",
  //   };
  //   console.log(obj);
  //   console.log({}.toString());

  const m = new Map();
  m.set("name", "alex");
  m.set(true, "true");
  m.set({}, "object");
  m.set(new Set([1, 2], "set"));
  m.set(undefined, "undefined");
  console.log(m);

Map实例的属性和方法

1.方法

  • get
  • has
  • delete
  • clear
  • forEach
      const m = new Map();
      // 使用 set 添加的新成员,键如果已经存在,后添加的键值会覆盖已有的
      m.set("name", "alex").set("age", 18).set("age", 20).set("gender", "man");

2.属性

  • size

Map构造函数的参数

1.数组

  //   console.log(new Map(["name", "alex", "age", 18]));
  // 只能传二维数组,而且必须体现出键和值
  //   console.log(
  //     new Map([
  //       ["name", "alex"],
  //       ["age", 18],
  //     ])
  //   );

2.Set Map 等

// Set
// set 中也必须体现出键和值
//   const s = new Set([
//     ["name", "alex"],
//     ["age", 18],
//   ]);
//   console.log(new Map(s));
      
// Map
const m1 = new Map([
["name", "alex"],
["age", 18],
]);

const m2 = new Map(m1);
console.log(m1);
console.log(m2);
console.log(m1 === m2);

Map的注意事项

1.判断键名是否相同的方式

// 基本遵循严格相等 (===)
// 例外就是 NaN,Map中NaN也是等于NaN
//   console.log(NaN === NaN);

//   const m = new Map();
//   m.set("NaN", 1).set("NaN", 1);
//   console.log(m);

2.什么时候使用 Map

 // 如果只是需要 Key -> value 的结构,或者需要字符串以外的值做键,使用Map更合适
// forEach
// size
// 只有模拟现实世界的实体时,才使用对象

// 只有模拟现实世界的实体时,才使用对象
      const person = {};

Map的应用

const [p1, p2, p3] = document.querySelectorAll("p");
      //   const m = new Map();
      //   m.set("p1", "red");
      //   m.set("p2", "green");
      //   m.set("p3", "blue");
      // const m = new Map([
      //   [
      //     p1,
      //     {
      //       color: "red",
      //       backgroundColor: "yellow",
      //       fontSize: "40px",
      //     },
      //   ],
      //   [
      //     p2,
      //     {
      //       color: "green",
      //       backgroundColor: "pink",
      //       fontSize: "40px",
      //     },
      //   ],
      //   [
      //     p3,
      //     {
      //       color: "blue",
      //       backgroundColor: "orange",
      //       fontSize: "40px",
      //     },
      //   ],
      // ]);
      // m.forEach((propObj, ele) => {
      //   for (let key in propObj) {
      //     ele.style[key] = propObj[key];
      //   }
      // });

      const m = new Map([
        [
          p1,
          new Map([
            ["color", "red"],
            ["backgroundColor", "yellow"],
            ["fontSize", "40px"],
          ]),
        ],
        [
          p2,
          new Map([
            ["color", "green"],
            ["backgroundColor", "pink"],
            ["fontSize", "40px"],
          ]),
        ],
        [
          p3,
          new Map([
            ["color", "blue"],
            ["backgroundColor", "orange"],
            ["fontSize", "40px"],
          ]),
        ],
      ]);
      m.forEach((propObj, ele) => {
        propObj.forEach((value, key) => {
          ele.style[key] = value;
        });
      });

iterator是什么

1.iterator的作用

// inerator:遍历器(迭代器)
// for
// [1,2].forEach
// new Set().forEach

// iterator 也是用来遍历的


2.寻找iterator

const it = [1, 2][Symbol.iterator]();
console.log(it);

3.使用 Iterator

 const it = [1, 2][Symbol.iterator]();
console.log(it.next()); // {value: 1, done: false}
console.log(it.next()); // {value: 2, done: false}
console.log(it.next()); // {value: undefined, done: true}

4.什么是iterator

// Symbol.iterator(可遍历对象的生成方法) -> it(可遍历对象)-> it.next() -> it.next() -> ... (直到 done 为 true)

iterator解惑

1.为什么需要 iterator 遍历器

// 遍历数组:for 循环和 forEach 方法
// 遍历对象:for in 循环
// iterator 遍历器是一个统一的遍历方式

2.如何更方便的使用 lterator

 // Symbol.iterator->it->next()

      // 我们一般不会直接使用 Iterator 去遍历
      // for..of

for...of的用法

1.认识 for...of

 //   const arr = [1, 2, 3];
//   const obj = {
//     name: "xiaoming",
//     age: 18,
//     render: "男",
//   };
//   const it = arr[Symbol.iterator]();
//   let next = it.next();
//   while (!next.done) {
//     console.log(next.value);
//     next = it.next();
//     console.log(next);
//   }

//   for (let item of arr) {
//     console.log(item);
//   }

2.与break、continue 一起使用

      const arr = [1, 2, 3];
      //   for (let item of arr) {
      //     if (item === 2) {
      //       continue;
      //     }
      //     console.log(item);
      //   }

3.在for...of中取得数组的索引

const arr = [1, 2, 3];
// keys()得到的是索引的可遍历对象,可以遍历出索引值
//   for (let key of arr.keys()) {
//     console.log(key);
//   }

// values()得到的值的可遍历对象,可以遍历出值
//   for (const value of arr.values()) {
//     console.log(value);
//   }

//   for (let [index, value] of arr.entries()) {
//     console.log(index, value);
//   }

原生可遍历和非原生可遍历

1.什么是可遍历

// 只要有Symbol.iterator方法,并且这个方法可以生成可遍历对象,就是可遍历的
// 只要可遍历,就可以使用for...of循环来统一遍历

2.原生可遍历的有哪些

  • 数组
  • 字符串
  • Set
  • Map
  • arguments
  • NodeList
for (let item of document.querySelectorAll("p")) {
        item.style.color = "red";
        console.log(item);
        dispa;
      }