Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Set

完整的例子

let set = new Set();
set.add("foo");
set.add("bar");
set.add("foo"); // 重复添加不会生效

// 或者一步到位直接初始化
let set = new Set(["foo", "bar"]);

let value1 = set.has("foo");
console.log(value1); // true

let value2 = set.has("qux");
console.log(value2); // false

set.delete("bar");

let value3 = set.has("bar");
console.log(value3); // false

let value4 = set.size;
console.log(value4); // 1

set.clear();

let value5 = set.size;
console.log(value5); // 0

其实 JavaScript 中可以用对象来模拟 Set 的功能

用对象模拟:

let set = {};
set["foo"] = true;
set["bar"] = true;
set["foo"] = true; // 重复添加不会增加新键

// 或者一步到位初始化
let set = {
  foo: true,
  bar: true,
};

let value1 = Object.hasOwn(set, "foo");
console.log(value1); // true

let value2 = Object.hasOwn(set, "qux");
console.log(value2); // false

delete set["bar"];

let value3 = Object.hasOwn(set, "bar");
console.log(value3); // false

let value4 = Object.keys(set).length;
console.log(value4); // 1

set = {};

let value5 = Object.keys(set).length;
console.log(value5); // 0

2. 要点

  • Set 的主要特点是自动去重,添加重复的值不会生效

    let set = new Set([1, 2, 2, 3, 3, 3]);
    console.log(set.size); // 3
    console.log([...set]); // [1, 2, 3]
    
  • Set 可以存储任何类型的值,包括对象和原始值

    let set = new Set();
    set.add(1);
    set.add("1");
    set.add(true);
    set.add({ name: "obj" });
    
    console.log(set.size); // 4,不同类型的值被视为不同
    
  • Set 的遍历方法

    let set = new Set(["foo", "bar", "baz"]);
    
    // forEach
    set.forEach((value) => {
      console.log(value);
    });
    
    // for...of
    for (let item of set) {
      console.log(item);
    }
    
    // 转换为数组
    let arr = [...set];
    // 或者
    let arr = Array.from(set);
    
  • 数组去重的最佳实践就是利用 Set

    let arr = [1, 2, 2, 3, 4, 4, 5];
    let uniqueArr = [...new Set(arr)];
    console.log(uniqueArr); // [1, 2, 3, 4, 5]