在 ES6 中,Symbol 被引入作为一种新的原始数据类型,用于表示独一无二的值。ES8 中,Symbol 得到了更多的增强和扩展,其中最重要的是用于交互操作。本文将深入解读 ES8 中 Symbol 类型的用法,包括 Symbol.for()、Symbol.keyFor()、Symbol.iterator 和 Symbol.asyncIterator 等。
Symbol.for()
Symbol.for() 方法可以创建或获取一个全局 Symbol,并将其关联一个字符串 key。如果已经有一个 key,那么就返回已经存在的 Symbol,否则就创建一个新的 Symbol。
const s1 = Symbol.for('foo'); const s2 = Symbol.for('foo'); console.log(s1 === s2); // true
上面的代码中,s1 和 s2 都是 Symbol 类型的值,它们的 key 都是 'foo',因此它们是相等的。Symbol.for() 方法在全局 Symbol 注册表中搜索 key 对应的 Symbol,如果找到了就返回它,否则就创建一个新的 Symbol 并注册到全局 Symbol 注册表中。
Symbol.keyFor()
Symbol.keyFor() 方法可以返回与某个全局 Symbol 关联的字符串 key。
const s1 = Symbol.for('foo'); console.log(Symbol.keyFor(s1)); // 'foo'
上面的代码中,s1 是一个全局 Symbol,它的 key 是 'foo'。Symbol.keyFor() 方法接收一个 Symbol 类型的参数,返回该 Symbol 关联的字符串 key。
Symbol.iterator
Symbol.iterator 是一个内置 Symbol,它表示对象的默认迭代器。当一个对象实现了 Symbol.iterator 方法时,它就成为了可迭代的,可以使用 for...of 循环进行遍历。
const arr = [1, 2, 3]; const iterator = arr[Symbol.iterator](); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: undefined, done: true }
上面的代码中,arr 是一个数组,它实现了 Symbol.iterator 方法,因此可以使用 for...of 循环进行遍历。arrSymbol.iterator 方法返回一个迭代器对象,它的 next() 方法返回一个包含 value 和 done 两个属性的对象,表示当前迭代的值和是否完成迭代。
Symbol.asyncIterator
Symbol.asyncIterator 是一个内置 Symbol,它表示对象的异步迭代器。当一个对象实现了 Symbol.asyncIterator 方法时,它就成为了可异步迭代的,可以使用 for await...of 循环进行遍历。
async function asyncFunc() { const arr = [1, 2, 3]; for await (const item of arr) { console.log(item); } } asyncFunc(); // 1 2 3
上面的代码中,asyncFunc() 函数中的 for await...of 循环遍历了一个数组,并输出了每个元素的值。arr 实现了 Symbol.asyncIterator 方法,因此可以使用 for await...of 循环进行遍历。注意,for await...of 循环需要在异步上下文中运行,因此 asyncFunc() 函数前面有一个 async 关键字。
总结
本文深入解读了 ES8 中 Symbol 类型的用法,包括 Symbol.for()、Symbol.keyFor()、Symbol.iterator 和 Symbol.asyncIterator 等。这些方法都有着广泛的应用场景,掌握它们可以让我们更加高效地编写交互式前端代码。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656a8a1cd2f5e1655d2f2453