在 ECMAScript 2018 标准中,Symbols 和 Iterator 是两个非常重要的新特性。Symbol 是一种新的原始数据类型,可以用来创建唯一的标识符。而 Iterator 则是一种新的迭代器接口,可以用来遍历可迭代对象。
在本文中,我们将探讨如何使用 Symbols 和 Iterator 来创建迭代器,并解决一些常见的问题。
Symbols
Symbols 可以用来创建唯一的标识符,这些标识符可以用于对象的属性名,以及其他一些场合。Symbols 是一种原始数据类型,使用 Symbol 函数进行创建。
const mySymbol = Symbol(); console.log(mySymbol); // Symbol()
每个 Symbol 都是唯一的,即使创建时传入的参数相同。这是因为 Symbol 的内部实现使用了一个全局的注册表,来维护已经创建过的 Symbol。
const mySymbol1 = Symbol('mySymbol'); const mySymbol2 = Symbol('mySymbol'); console.log(mySymbol1 === mySymbol2); // false
Symbols 作为属性名
由于 Symbols 是唯一的,因此可以用来作为对象的属性名,避免了属性名冲突的问题。
const mySymbol = Symbol('mySymbol'); const myObject = { [mySymbol]: 'Hello, World!' }; console.log(myObject[mySymbol]); // Hello, World!
内置 Symbols
ECMAScript 2018 中定义了一些内置的 Symbols,用于表示一些特殊的行为。例如,Symbol.iterator 用于表示一个对象是否可迭代。我们将在下一节中详细讨论这个问题。
Iterator
Iterator 是一种新的迭代器接口,可以用来遍历可迭代对象。可迭代对象是一种具有 Symbol.iterator 方法的对象,该方法返回一个迭代器对象。
-- -------------------- ---- ------- ----- ---------- - - ------------------- - --- - - -- ------ - ------ - ----- ---- - - -- -- ----- ----- - ---- - --------- - ---- ------ - ------ ---- -- - -- - -- --- ------ ---- -- ----------- - ------------------ - -- - -- - -- -
在上面的例子中,我们创建了一个可迭代对象 myIterable,它具有 Symbol.iterator 方法,该方法返回一个迭代器对象。迭代器对象具有 next 方法,每次调用该方法都会返回一个包含 value 和 done 属性的对象。当 done 为 true 时,表示迭代已经结束。
内置可迭代对象
ECMAScript 2018 中定义了一些内置的可迭代对象,例如数组、Set、Map 等。这些对象都具有 Symbol.iterator 方法,因此可以使用 for...of 循环来遍历。
const myArray = [1, 2, 3]; for (const item of myArray) { console.log(item); } // 1 // 2 // 3
解决迭代器问题
有时候我们需要对一个可迭代对象进行多次迭代,或者在迭代过程中进行一些额外的操作。这时候,我们可以使用 Generator 函数来创建一个迭代器。
-- -------------------- ---- ------- --------- ------------- - ----- -- ----- -- ----- -- - ----- ---------- - -------------- ------------------------------------- -- - ------------------------------------- -- - ------------------------------------- -- -
在上面的例子中,我们使用 Generator 函数 myGenerator 来创建一个迭代器。每次调用 myIterator.next() 方法都会返回一个包含 value 和 done 属性的对象。
注意,Generator 函数的执行是惰性的,即只有在调用 next 方法时才会执行。因此,我们可以在迭代过程中进行一些额外的操作,例如修改迭代器的状态。
-- -------------------- ---- ------- --------- ------------- - --- - - -- ----- ------ - ----- ----- - ----- ---- -- ------- - - - -- - - - ----- ---------- - -------------- ------------------------------------- -- - ------------------------------------- -- - ----------------------------------------- -- - ------------------------------------- -- -
在上面的例子中,我们创建了一个可以重置的迭代器。每次调用 myIterator.next(reset) 方法时,如果 reset 为 true,则会将迭代器的状态重置为 0。
总结
Symbols 和 Iterator 是 ECMAScript 2018 中的两个重要特性。Symbols 可以用来创建唯一的标识符,Iterator 可以用来遍历可迭代对象。我们可以使用 Symbols 和 Iterator 来解决一些常见的迭代器问题,例如多次迭代和迭代器状态的修改。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65c88559add4f0e0ff2530e4