文章目录
- 前言
- 1.唯一性
- 2. 描述
- 3. 作为对象属性键
- 4. 全局注册
- 6. 不可变性
- 7. 隐式转换
前言
Symbol
是ES6新增内容,代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题
在JavaScript发展的过程中,其中的ES6带来了一系列的新特性,其中之一就是Symbol。Symbol是一种特殊的原始数据类型,它提供了一种创建全局唯一标识符的方式,这对于避免命名冲突尤其有用。不同于传统的字符串或数字,每个Symbol都是独立且唯一的,即使它们具有相同的描述。这使得Symbol非常适合用于对象属性的键,从而避免了与其他属性键发生冲突的可能性。本文旨在深入探讨Symbol的各个方面,包括它的创建、使用方法以及与其他数据类型的交互方式,帮助更好地理解和利用这一特性。
1.唯一性
每次调用 Symbol() 都会返回一个新的、唯一的 Symbol 值
const sym1 = Symbol();
const sym2 = Symbol();
console.log(sym1 === sym2); // false
2. 描述
可以给 Symbol 提供一个可选的字符串参数作为描述,这有助于调试,但不会影响 Symbol 的唯一性
const sym = Symbol('mySymbol');
console.log(sym.toString()); // "Symbol(mySymbol)"
3. 作为对象属性键
Symbol 可以用作对象属性的键,并且不会与任何字符串键冲突
const key = Symbol('key');
const obj = {[key]: 'value'
};
console.log(obj[key]); // 'value'
console.log(obj['key']); // undefined
4. 全局注册
使用 Symbol.for(key) 可以创建一个全局唯一的 Symbol,如果之前已经存在相同的键,则返回已存在的 Symbol。
const sym1 = Symbol.for('foo');
const sym2 = Symbol.for('foo');
console.log(sym1 === sym2); // true
6. 不可变性
Symbol 是不可变的,一旦创建就无法改变其值。
7. 隐式转换
当尝试将 Symbol 转换成其他类型(如数字或字符串)时,会抛出 TypeError。不过,Symbol 可以通过 .toString() 或 .description 获得其字符串表示形式。