在 JavaScript 中,Symbol 是一种新的原始数据类型,用于创建一个唯一的标识符。在 ES10 中,Symbol 引入了两个新的标识符:Symbol.&Symbol.asyncIterator。它们的使用非常有意义,本文将详细介绍它们的使用方法。
Symbol
Symbol 是一种新的原始数据类型,用于表示一个唯一的、不可变的标识符。它可以通过 Symbol() 函数创建,创建 Symbol 的时候,可以给它一个可选的描述字符串。
const mySymbol = Symbol('mySymbol'); console.log(mySymbol); // Symbol(mySymbol)
在 JavaScript 中,每个 Symbol 都是唯一的,两个 Symbol 比较的结果一定是 false。
const mySymbol1 = Symbol('mySymbol'); const mySymbol2 = Symbol('mySymbol'); console.log(mySymbol1 === mySymbol2); // false
Symbol 还可以作为对象的属性名使用,这样可以解决同名属性的冲突问题。
const obj = {}; const mySymbol = Symbol('mySymbol'); obj[mySymbol] = 'value'; console.log(obj[mySymbol]); // value
Symbol.iterator
Symbol.iterator 是一个用于指定一个对象的迭代器方法的 Symbol。当一个对象实现了 Symbol.iterator 方法时,就可以使用 for...of 循环来迭代这个对象了。
const myArray = [1, 2, 3]; const iterator = myArray[Symbol.iterator](); for (const value of iterator) { console.log(value); }
上面的代码中,myArray 实现了 Symbol.iterator 方法,返回了一个迭代器对象 iterator,然后使用 for...of 循环迭代了这个迭代器对象。
实际上,Array、Map、Set、String、TypedArray 等内置对象都实现了 Symbol.iterator 方法,也就可以使用 for...of 循环来迭代它们了。
Symbol.asyncIterator
在 ES10 中,还新增了一个用于指定异步迭代器方法的 Symbol:Symbol.asyncIterator。当一个对象实现了 Symbol.asyncIterator 方法时,就可以使用 for await...of 循环来异步迭代这个对象了。
-- -------------------- ---- ------- ----- ----- - ---- -- --- --------------- -- ------------------- ----- ----- --------------- - - ----- ------------------------- - --- ---- - - -- - -- -- ---- - ----- ------------ ----- -- - - -- ------ -- -- - --- ----- ------ ----- -- ---------------- - ------------------- - -----
上面的代码中,myAsyncIterable 实现了 Symbol.asyncIterator 方法,返回了一个异步迭代器对象。然后使用 for await...of 循环,迭代了这个异步迭代器对象。
需要注意的是,只有实现了 Symbol.asyncIterator 方法的对象,才能使用 for await...of 循环来异步迭代。
总结
Symbol 和 Symbol.iterator、Symbol.asyncIterator 都是在 ES6、ES10 中新增的标识符。它们的引入非常有意义,让我们可以更好地管理对象和异步操作,提高代码的可读性、可维护性。
值得一提的是,对于一些功能比较强大的库或框架,也可以通过实现 Symbol.iterator、Symbol.asyncIterator 方法来为用户提供更好的迭代功能。
如果你还没有尝试过 Symbol 和 Symbol.iterator、Symbol.asyncIterator,那么现在就是时候去尝试一下了。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e2de12f6b2d6eab3e2a00d