Symbol 是 ECMAScript 2015 新增的一种数据类型,它是一种基本数据类型,不同于传统的 String、Number、Boolean、Object、Array 和 Function 等数据类型。本文将详细介绍 Symbol 的概念、创建方式、用途和应用场景。
1. 概念
Symbol 是一种独一无二的值,可以用来表示对象属性的 key,避免对象 key 命名冲突,并保证属性的唯一性。每个 Symbol 的值都是唯一的,不可变的和不可复制的。
2. 创建方式
Symbol 可以使用全局的 Symbol 函数来创建,如下所示:
const symbol = Symbol();
Symbol 函数也可以接受一个字符串作为参数,这个字符串是 Symbol 值的描述,主要用于调试和检测 Symbol 值时使用,如下所示:
const symbol = Symbol('my symbol');
3. 用途
3.1. 避免属性名冲突
Symbol 可以用来作为对象属性的 key,避免属性名冲突,如下所示:
const symbol = Symbol(); const obj = { [symbol]: 'value' }; console.log(obj[symbol]); // 'value'
3.2. 定义类的私有方法
Symbol 可以用来定义类的私有方法,如下所示:
-- -------------------- ---- ------- ----- ------------- - ------------------------ ----- ------- - ----------------- - ----------------- -- - ------- --------- - -------------- - ----------------- -- - ------ --------- ---------------------- - - ----- ------- - --- ---------- ----------------------- -- ----- -- - ------ ------- ----- -- - ------- ------- ------------------------- -- ---------- --------------------- -- --- - --------
3.3. 定义常量枚举
Symbol 可以用来定义不可变的常量枚举,如下所示:
const COLOR_RED = Symbol('red'); const COLOR_GREEN = Symbol('green'); const COLOR_BLUE = Symbol('blue'); const COLOR = { RED: COLOR_RED, GREEN: COLOR_GREEN, BLUE: COLOR_BLUE };
4. 应用场景
4.1. 类型的判断
Symbol 可以用来判断类型,因为每个 Symbol 值都是唯一的,不同的 Symbol 值一定不相等,如下所示:
const symbol = Symbol(); console.log(typeof symbol); // 'symbol' console.log(symbol instanceof Symbol); // false console.log(symbol.constructor === Symbol); // true console.log(Object.prototype.toString.call(symbol)); // '[object Symbol]' console.log(symbol === Symbol()); // false
4.2. 迭代器的方法名
Symbol 可以用来定义可迭代对象的方法名,如下所示:
-- -------------------- ---- ------- ----- -------- - - ------------------- - --- ----- - -- ------ - ------ - -------- ------ ------- - ---- -- ------ - ------ ------ ----- ----- -- ---- -- ------ - ------ ------ ----- ----- -- -------- ------ - ----- ---- -- - -- ------------------- - ------ ----- - -- - -- --- ------ ---- -- --------- - ------------------ -- ----- ----- -
4.3. 内置对象的扩展
Symbol 可以用来扩展内置对象的方法和功能,如下所示:
Object.prototype[Symbol.toStringTag] = 'MyObject'; console.log({}.toString()); // '[object MyObject]'
5. 总结
Symbol 是 ECMAScript 2015 中新增的一种基本数据类型,用来表示对象属性的 key,避免属性命名冲突,定义类的私有方法和常量枚举,判断类型,定义可迭代对象的方法名,扩展内置对象的方法和功能等。在实际开发中,我们应该善于使用 Symbol,提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64b24f7948841e9894e92217