ES6 引入了一种新的基本数据类型 Symbol
,它是一种类似于字符串的数据类型,但具有唯一性。在使用时,我们可以给 Symbol 变量赋值一个描述,但这个描述只是一个可选参数,不会影响这个 Symbol 变量的唯一性。
Symbol 的创建
在创建 Symbol 时,我们可以使用 Symbol()
函数来创建一个全局唯一的 Symbol 变量。
const symbolA = Symbol(); const symbolB = Symbol(); console.log(symbolA === symbolB); // false
上述代码创建了两个不同的 Symbol 变量,它们在内存中的地址是不同的,所以它们不相等。
我们也可以使用可选参数给 Symbol 变量添加一个描述,这个描述将作为 Symbol 变量的注释,方便我们在开发时识别不同的 Symbol 变量。
const symbolC = Symbol('foo'); const symbolD = Symbol('foo'); console.log(symbolC === symbolD); // false
上述代码创建了两个描述相同但不相等的 Symbol 变量,它们的描述不会影响它们的唯一性。
Symbol 的应用场景
1. 属性名
Symbol 变量可以作为对象属性的名称,使用 Symbol 变量作为属性名可以避免属性名的冲突,因为它们是全局唯一的。
const myObj = {}; const MY_KEY = Symbol(); myObj[MY_KEY] = 'value'; console.log(myObj[MY_KEY]); // 'value'
上述代码创建了一个名为 MY_KEY
的 Symbol 变量,并将它作为 myObj
对象的属性名。这样,我们就可以使用 Symbol 变量来作为对象属性的名称了。
2. 迭代器
Symbol 还可以用来创建迭代器,实现对象的可迭代性。
const myIterable = {}; myIterable[Symbol.iterator] = function* () { yield 1; yield 2; yield 3; }; [...myIterable]; // [1, 2, 3]
上述代码创建了一个包含三个元素的可迭代对象 myIterable
,当我们使用扩展运算符将其转化为数组时,得到的结果为 [1, 2, 3]
。
3. 内置迭代器
ES6 中的一些内置迭代器使用了 Symbol 变量作为属性名,例如 Map
和 Set
类型中的迭代器方法。我们可以使用这些迭代器方法来遍历 Map
和 Set
中的元素。
const myMap = new Map(); myMap.set(0, 'zero') .set(1, 'one'); for (const [key, value] of myMap) { console.log(key, value); // 0 'zero', 1 'one' }
上述代码创建了一个 Map
类型的对象 myMap
,它包含了两个键值对。我们可以使用 for...of
循环来遍历 myMap
中的元素。
总结
Symbol 变量是 ES6 中的新数据类型,它具有唯一性、可作为属性名和迭代器等特性。在编写代码时,我们可以使用 Symbol 变量来避免属性名的冲突,同时也可以方便地遍历对象中的元素。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e1e957f6b2d6eab3d33191