可迭代
JavaScript中有几种可迭代的类型,也就是可以通过迭代器进行遍历的类型。以下是一些常见的可迭代类型:
- 数组(Array):数组是一种有序的数据集合,其中的元素可以通过索引进行访问。你可以使用 for…of 循环或迭代器方法(如 forEach()、map()、reduce() 等)对数组进行迭代。
- 字符串(String):字符串是由一系列字符组成的序列。你可以使用 for…of 循环或迭代器方法对字符串进行逐字符迭代。
- Set:Set 是一种集合类型,其中的元素是唯一且无序的。你可以使用 for…of 循环或迭代器方法对 Set 进行迭代。
- Map:Map 是一种键值对的集合类型。每个键对应一个值,键是唯一的。你可以使用 for…of 循环或迭代器方法对 Map 进行迭代。
- 类数组对象(Array-like objects):这些对象看起来像数组,但不具有数组的所有方法和属性。它们具有数值索引和 length 属性。例如,arguments 对象和 NodeList 就是类数组对象。你可以使用 for…of 循环或通过将它们转换为真正的数组来进行迭代。
- 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 实例时,它们有一些区别和不同的特性。
- 数据结构:Set 是一种集合数据结构,用于存储唯一的值,而 Object 是一种键值对的数据结构,用于存储键值对的集合。
- 值的唯一性:Set 中的值是唯一的,它不允许重复的值存在。当你尝试向 Set 中添加重复的值时,它将被忽略。而在 Object 中,每个键都必须是唯一的,但值可以重复。
- 键的类型:在 Object 中,键可以是字符串或符号(Symbol),而在 Set 中,值本身就是键,可以是任何类型的值。
- 迭代顺序:在 Set 中,元素的迭代顺序是插入顺序。也就是说,当你遍历 Set 时,元素的顺序将按照它们被插入的顺序进行迭代。而在 Object 中,属性的迭代顺序是不确定的。
- 方法和属性:Set 提供了一些常用的方法,如 add()、delete()、has() 等,用于操作集合中的元素。而 Object 则提供了一些与属性操作相关的方法和属性,如 Object.keys()、Object.values()、Object.entries() 等。
总的来说,Set 用于存储唯一的值的集合,而 Object 用于存储键值对的集合。它们具有不同的行为和用途,根据你的需求选择适合的数据结构。
Set应用
Set 和数组经常在 JavaScript 中相互配合工作,以完成各种任务。这是因为它们具有不同的特性和功能,可以在不同的场景中发挥作用。
下面是一些常见的使用场景,展示了 Set 和数组如何相互配合工作:
- 去重: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处理网站关键词
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中用于存储和管理数据的结构,但它们有一些区别。
- 键的类型:在Map中,键可以是任何数据类型,包括基本类型(如字符串、数字等)以及引用类型(如对象、数组等)。而在对象中,键只能是字符串或符号。
- 键的顺序:在Map中,键值对是按照插入顺序进行存储的,因此保留了键的顺序。而在对象中,键的顺序是不确定的,对象的属性没有固定的顺序。
- 内存占用:在处理大量数据时,Map通常比对象更高效。这是因为Map使用了更复杂的数据结构,可以处理大量的键值对,并提供更好的性能。
- 迭代和操作方法: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函数的返回值是可以被迭代的。
可枚举