js的迭代和枚举

可迭代
JavaScript中有几种可迭代的类型,也就是可以通过迭代器进行遍历的类型。以下是一些常见的可迭代类型:

  1. 数组(Array):数组是一种有序的数据集合,其中的元素可以通过索引进行访问。你可以使用 for…of 循环或迭代器方法(如 forEach()、map()、reduce() 等)对数组进行迭代。
  2. 字符串(String):字符串是由一系列字符组成的序列。你可以使用 for…of 循环或迭代器方法对字符串进行逐字符迭代。
  3. Set:Set 是一种集合类型,其中的元素是唯一且无序的。你可以使用 for…of 循环或迭代器方法对 Set 进行迭代。
  4. Map:Map 是一种键值对的集合类型。每个键对应一个值,键是唯一的。你可以使用 for…of 循环或迭代器方法对 Map 进行迭代。
  5. 类数组对象(Array-like objects):这些对象看起来像数组,但不具有数组的所有方法和属性。它们具有数值索引和 length 属性。例如,arguments 对象和 NodeList 就是类数组对象。你可以使用 for…of 循环或通过将它们转换为真正的数组来进行迭代。
  6. Generator:Generator 是一种特殊类型的函数,它可以产生多个值的序列。你可以使用 for…of 循环或使用 next() 方法来迭代 Generator。

这些可迭代类型都支持 for…of 循环语法,它提供了一种简洁的方式来遍历它们的元素。

需要注意的是,对象(Object)本身不是可迭代类型。如果你想遍历对象的属性,你可以使用 for…in 循环或使用 Object.keys()、Object.values() 或 Object.entries() 等方法来获取可迭代的属性数组,然后对其进行迭代。
详解Set
Set 是一种集合数据结构,用于存储唯一的值。创建 Set 实例时,我们必须使用 new Set(),而不是使用对象字面量的方式。
语法:
new Set()
new Set(iterable)
参数:
iterable
如果传入一个可迭代对象,它的所有元素将不重复地被添加到新的 Set 中。如果不指定此参数或其值为 null,则新的 Set 为空。

当涉及到 Set 实例和 Object 实例时,它们有一些区别和不同的特性。

  1. 数据结构:Set 是一种集合数据结构,用于存储唯一的值,而 Object 是一种键值对的数据结构,用于存储键值对的集合。
  2. 值的唯一性:Set 中的值是唯一的,它不允许重复的值存在。当你尝试向 Set 中添加重复的值时,它将被忽略。而在 Object 中,每个键都必须是唯一的,但值可以重复。
  3. 键的类型:在 Object 中,键可以是字符串或符号(Symbol),而在 Set 中,值本身就是键,可以是任何类型的值。
  4. 迭代顺序:在 Set 中,元素的迭代顺序是插入顺序。也就是说,当你遍历 Set 时,元素的顺序将按照它们被插入的顺序进行迭代。而在 Object 中,属性的迭代顺序是不确定的。
  5. 方法和属性:Set 提供了一些常用的方法,如 add()、delete()、has() 等,用于操作集合中的元素。而 Object 则提供了一些与属性操作相关的方法和属性,如 Object.keys()、Object.values()、Object.entries() 等。
    总的来说,Set 用于存储唯一的值的集合,而 Object 用于存储键值对的集合。它们具有不同的行为和用途,根据你的需求选择适合的数据结构。

Set应用
Set 和数组经常在 JavaScript 中相互配合工作,以完成各种任务。这是因为它们具有不同的特性和功能,可以在不同的场景中发挥作用。
下面是一些常见的使用场景,展示了 Set 和数组如何相互配合工作:

  1. 去重:Set 可用于去除数组中的重复元素,因为 Set 中的元素是唯一的。你可以通过将数组转换为 Set,然后再将 Set 转换回数组来实现去重。
    const array = [1, 2, 2, 3, 3, 4, 5];
    const uniqueArray = Array.from(new Set(array));

console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]
2. 数组元素的存在性检查:Set 可以很方便地检查数组中特定元素是否存在。你可以将数组转换为 Set,并使用 Set 的 has() 方法来检查元素是否存在。
const array = [1, 2, 3, 4, 5];
const set = new Set(array);

console.log(set.has(3)); // 输出: true
console.log(set.has(6)); // 输出: false
3. 数组元素的交集、并集和差集:通过将数组转换为 Set,并使用 Set 的方法,可以轻松地计算数组之间的交集、并集和差集。
const array1 = [1, 2, 3, 4, 5];
const array2 = [4, 5, 6, 7, 8];

const set1 = new Set(array1);
const set2 = new Set(array2);

// 交集
const intersection = Array.from(new Set([…set1].filter(x => set2.has(x))));
console.log(intersection); // 输出: [4, 5]

// 并集
const union = Array.from(new Set([…set1, …set2]));
console.log(union); // 输出: [1, 2, 3, 4, 5, 6, 7, 8]

// 差集
const difference = Array.from(new Set([…set1].filter(x => !set2.has(x))));
console.log(difference); // 输出: [1, 2, 3]
通过将数组转换为 Set,可以使用 Set 提供的方法和功能来解决一些特定问题,而数组则提供了更多的灵活性和常用的操作方法。

案例:使用Set处理网站关键词

Document
360 搜索 搜索
历史记录
    详解Map 概念 Map是一种用于存储键值对的集合,其中每个键都是唯一的。它提供了一些方法来操作和访问这些键值对。 以下是一些常用的Map操作: 1. 创建一个Map对象: const myMap = new Map(); 2. 添加键值对: myMap.set('key1', 'value1'); myMap.set('key2', 'value2'); 3. 获取值: const value1 = myMap.get('key1'); 4. 检查键是否存在: const hasKey = myMap.has('key1'); 5. 删除键值对: myMap.delete('key1'); 6. 清空Map: myMap.clear(); 7. 迭代Map: myMap.forEach((value, key) => { console.log(key, value); });

    for (const [key, value] of myMap) {
    console.log(key, value);
    }

    for (const key of myMap.keys()) {
    console.log(key);
    }

    for (const value of myMap.values()) {
    console.log(value);
    }

    和对象的区别
    当谈到Map和对象时,它们都是在JavaScript中用于存储和管理数据的结构,但它们有一些区别。

    1. 键的类型:在Map中,键可以是任何数据类型,包括基本类型(如字符串、数字等)以及引用类型(如对象、数组等)。而在对象中,键只能是字符串或符号。
    2. 键的顺序:在Map中,键值对是按照插入顺序进行存储的,因此保留了键的顺序。而在对象中,键的顺序是不确定的,对象的属性没有固定的顺序。
    3. 内存占用:在处理大量数据时,Map通常比对象更高效。这是因为Map使用了更复杂的数据结构,可以处理大量的键值对,并提供更好的性能。
    4. 迭代和操作方法:Map提供了一系列用于迭代和操作键值对的内置方法,如get()、set()、delete()、forEach()等。而对象也有类似的方法,但需要使用Object.keys()、Object.values()等方法来操作对象的属性。

    总的来说,Map更适合在需要保留插入顺序、使用不同类型的键或处理大量数据时使用。对象则更适合在需要简单的键值对数据结构时使用。

    详解Generator
    概念
    生成器(Generator)是 JavaScript 中的一种函数类型。与普通函数不同,生成器函数具有特殊的语法和行为,允许您在函数执行期间暂停和恢复它的状态。这使得生成器函数能够生成一系列值,而不是一次性返回单个值。
    生成器函数使用function语法进行定义,其中function关键字后的表示这是一个生成器函数。生成器函数内部使用yield语句来定义暂停点,它暂停函数的执行并返回一个生成的值。每次调用生成器函数的next()方法时,函数会从上一个yield语句的位置继续执行,直到遇到下一个yield语句或函数结束。

    案例
    function* anotherGenerator(x) {
    let y = yield x + 2
    let k = yield y + 100
    yield k
    }

      const generator = anotherGenerator(1)
      console.log(generator.next()) // 3
      console.log(generator.next(10)) // 11
      console.log(generator.next(5)) // 5
    

    重点:
    next( ) 的参数会作为上一个yield的返回值。
    遇到yield就停止,除非调用next才会继续往下面执行
    调用Generator函数的返回值是可以被迭代的。

    可枚举

    • 18
      点赞
    • 16
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值