推荐答案
Symbol 的用法
Symbol 是 JavaScript 中的一种原始数据类型,用于创建唯一的标识符。每个 Symbol 值都是唯一的,即使它们的描述相同。
const symbol1 = Symbol('description'); const symbol2 = Symbol('description'); console.log(symbol1 === symbol2); // false
Symbol 通常用于对象属性的键,以避免属性名冲突。
const obj = { [Symbol('key')]: 'value' }; console.log(obj[Symbol('key')]); // undefined
Iterator 的用法
Iterator 是一种接口,它为不同的数据结构提供了一种统一的遍历机制。任何实现了 [Symbol.iterator]
方法的对象都可以被迭代。
-- -------------------- ---- ------- ----- -------- - - ------------------- - --- ---- - -- ------ - ------ - ------- -- ----- -- -- - ------ - ------ ----- ----- ----- -- - ------ - ----- ---- -- - -- - -- --- ------ ----- -- --------- - ------------------- -- -- -- - -
本题详细解读
Symbol 的详细解读
- 唯一性:每个 Symbol 值都是唯一的,即使它们的描述相同。这使得 Symbol 非常适合用作对象属性的键,以避免属性名冲突。
- 不可枚举:Symbol 属性不会出现在
for...in
循环中,也不会被Object.keys()
或Object.getOwnPropertyNames()
返回。可以使用Object.getOwnPropertySymbols()
来获取对象的 Symbol 属性。 - 全局 Symbol 注册表:可以使用
Symbol.for()
和Symbol.keyFor()
来创建和检索全局 Symbol。
const globalSymbol = Symbol.for('global'); console.log(Symbol.keyFor(globalSymbol)); // 'global'
Iterator 的详细解读
- 迭代协议:Iterator 协议要求对象实现一个
[Symbol.iterator]
方法,该方法返回一个迭代器对象。迭代器对象必须实现next()
方法,该方法返回一个包含value
和done
属性的对象。 - 可迭代对象:任何实现了
[Symbol.iterator]
方法的对象都是可迭代的。常见的可迭代对象包括数组、字符串、Map、Set 等。 - 内置迭代器:JavaScript 提供了许多内置的迭代器,如
Array.prototype[Symbol.iterator]
、String.prototype[Symbol.iterator]
等。
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 }
- 自定义迭代器:可以通过实现
[Symbol.iterator]
方法来创建自定义的迭代器,从而控制对象的遍历行为。
-- -------------------- ---- ------- ----- -------------- - - ----- ---- --- ---- ------------------- - --- ----- - -- ------ - ----- -- -- - -- ------ - ----------------- - ------ - ------ ------------------- ----- ----- -- - ------ - ----- ---- -- - -- - -- --- ------ ----- -- --------------- - ------------------- -- --- --- -- -