在 ES6 中,Symbol 是一种全新的原始数据类型,它可以用来创建唯一的、不可变的值。Symbol 值可以作为对象属性的标识符使用,这使得我们可以创建一些非常有用的特性。
1. Symbol 的基本用法
要创建一个 Symbol 值,我们可以使用全局的 Symbol() 函数,并传递一个可选的字符串作为参数,该参数用于 Symbol 的描述。
const sym = Symbol('my symbol'); console.log(sym); // Symbol(my symbol)
每个 Symbol 值都是唯一的,即使它们的描述相同。
const sym1 = Symbol('my symbol'); const sym2 = Symbol('my symbol'); console.log(sym1 === sym2); // false
2. Symbol 作为对象属性的标识符
Symbol 可以用作对象属性的标识符,这使得我们可以创建一些非常有用的特性。我们可以使用 Symbol 作为属性名来创建一些私有属性,这些属性不会被 for...in 循环、Object.keys() 和 JSON.stringify() 等方法遍历到。
-- -------------------- ---- ------- ----- ----- - --- ----- -------- - ---------- --------- --------------- - ------ ------- ----------------------------- -- ------ ------ --- ---- --- -- ------ - ----------------- -- ------- -- ------ - -------------------------------- -- -- ----------------------------------- -- --
3. Symbol 的一些注意事项
3.1. Symbol 不能被 new 操作符调用
Symbol 是原始数据类型,不能被 new 操作符调用。如果我们尝试这样做,会抛出一个 TypeError。
const sym = new Symbol(); // TypeError: Symbol is not a constructor
3.2. Symbol 不能被隐式转换为字符串
Symbol 值不能被隐式转换为字符串。如果我们尝试这样做,会得到一个 TypeError。
const mySymbol = Symbol('my symbol'); console.log('Symbol: ' + mySymbol); // TypeError: Cannot convert a Symbol value to a string
3.3. Symbol.for() 和 Symbol.keyFor()
Symbol.for() 方法可以用来创建或获取一个全局的 Symbol 值。如果我们传递一个字符串作为参数,它会在全局的 Symbol 注册表中查找该字符串对应的 Symbol 值。如果找到了,就返回该 Symbol 值;否则,就创建一个新的 Symbol 值,并将其注册到全局的 Symbol 注册表中。
const mySymbol = Symbol.for('my symbol'); const mySymbol2 = Symbol.for('my symbol'); console.log(mySymbol === mySymbol2); // true
Symbol.keyFor() 方法可以用来获取一个已经在全局的 Symbol 注册表中注册过的 Symbol 值对应的字符串。
const mySymbol = Symbol.for('my symbol'); console.log(Symbol.keyFor(mySymbol)); // 'my symbol'
4. 总结
Symbol 是一种全新的原始数据类型,它可以用来创建唯一的、不可变的值。Symbol 可以用作对象属性的标识符,这使得我们可以创建一些非常有用的特性。在使用 Symbol 时,需要注意一些细节,比如不能被 new 操作符调用,不能被隐式转换为字符串,以及使用 Symbol.for() 和 Symbol.keyFor() 方法时需要注意全局 Symbol 注册表。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65f7b02bd10417a2222f9ec2