在 ES6 中,我们已经看到了一些新的数据类型,如 Set 和 Map。而在 ES7 中,又引入了一种新的数据类型,它就是 Symbol。Symbol 是一种基本数据类型,它的作用是创建一个独一无二的值,用来作为对象属性的键名,避免键名的冲突。
Symbol 的特点
- Symbol 是一种基本数据类型,它的值是独一无二的。
- Symbol 的值可以作为对象的属性名,用来避免属性名的冲突。
- Symbol 的值不能与其他类型的值进行运算,但可以转换为字符串类型。
Symbol 的使用
创建 Symbol
我们可以使用 Symbol() 函数来创建一个 Symbol 类型的值,例如:
const s1 = Symbol(); const s2 = Symbol('foo'); const s3 = Symbol('bar');
上面的代码中,s1、s2、s3 都是 Symbol 类型的值,其中 s2 和 s3 分别传入了一个参数,用来描述这个 Symbol 值的含义。
Symbol 作为对象属性名
我们可以使用 Symbol 类型的值来作为对象的属性名,例如:
const obj = {}; const s1 = Symbol('foo'); const s2 = Symbol('bar'); obj[s1] = 'hello'; obj[s2] = 'world'; console.log(obj); // { [Symbol(foo)]: 'hello', [Symbol(bar)]: 'world' }
上面的代码中,我们创建了一个空对象 obj,然后使用 Symbol 类型的值 s1 和 s2 分别作为 obj 的属性名,并给它们赋值为 'hello' 和 'world'。
Symbol 作为常量
我们可以使用 Symbol 类型的值来作为常量,例如:
// javascriptcn.com 代码示例 const LEVEL_HIGH = Symbol(); const LEVEL_MEDIUM = Symbol(); const LEVEL_LOW = Symbol(); function getLevel(score) { if (score >= 90) { return LEVEL_HIGH; } else if (score >= 60) { return LEVEL_MEDIUM; } else { return LEVEL_LOW; } } const student1 = { name: 'Tom', score: 95 }; const student2 = { name: 'Jerry', score: 80 }; const student3 = { name: 'Bob', score: 50 }; console.log(getLevel(student1.score)); // Symbol() console.log(getLevel(student2.score)); // Symbol() console.log(getLevel(student3.score)); // Symbol()
上面的代码中,我们定义了三个常量 LEVEL_HIGH、LEVEL_MEDIUM 和 LEVEL_LOW,它们的值都是 Symbol 类型的,分别表示高分、中分和低分。然后我们定义了一个函数 getLevel,根据学生的得分返回对应的常量。最后我们创建了三个学生对象,并调用 getLevel 函数来获取它们的等级。
Symbol 的转换
Symbol 类型的值不能与其他类型的值进行运算,但可以转换为字符串类型,例如:
const s1 = Symbol('foo'); console.log(s1); // Symbol(foo) console.log(s1.toString()); // 'Symbol(foo)' console.log(String(s1)); // 'Symbol(foo)'
上面的代码中,我们创建了一个 Symbol 类型的值 s1,然后使用 toString() 和 String() 方法将其转换为字符串类型。
Symbol 的指导意义
Symbol 类型的值可以用来作为对象属性名,避免属性名的冲突。在实际开发中,我们经常会遇到多个模块或者多个开发者共同开发一个项目的情况,如果每个模块或者开发者都使用自己的属性名,就会出现属性名冲突的问题,使用 Symbol 类型的值作为属性名可以有效地避免这个问题。
此外,Symbol 类型的值还可以用来作为常量,用来表示一些固定的值,比如上面的例子中的高分、中分和低分。使用 Symbol 类型的值作为常量可以避免使用字符串或者数字类型的常量出现值相同的问题。
总结
Symbol 是 ES7 中引入的一种基本数据类型,它的作用是创建一个独一无二的值,用来作为对象属性的键名,避免键名的冲突。Symbol 类型的值可以用来作为对象属性名和常量,可以有效地避免属性名冲突和常量值相同的问题。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656d7b67d2f5e1655d5bd32a