总结
- Symbol 是一个基础数据类型,表示独一无二的值,可以用于消除魔术字符串。
- Symbol 的创建不用new操作符,直接用 Symbol(val)。
- Symbol 可以作对象属性,该属性是唯一的,Symbol 作为对象属性名时,不能用点运算符。
- 获取对象中的 Symbol 属性,可以用 Object.getOwnPropertySymbols 或 Reflect.ownKeys。
- 常用方法
Symbol.for: 搜索 SymbolSymbol.keyFor: 获取 Symbol 的 key
独一无二的值
let id1 = Symbol('id');
let id2 = Symbol('id');
console.log(id1 == id2); //false
作用:消除魔术字符串(魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替。)
var shapeType = {
triangle: 'Triangle'
};
function getArea(shape, options) {
var area = 0;
switch (shape) {
case shapeType.triangle:
area = .5 * options.width * options.height;
break;
}
return area;
}
getArea(shapeType.triangle, { width: 100, height: 100 });
改为:
const shapeType = {
triangle: Symbol()
};
triangle 需确保与其他值不发生冲突。
不能使用 new 命令
是一种类似于字符串的数据类型,可以接收一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

对象属性值两种类型
- 一种是原本就有的字符串,另一种是新增的 Symbol 类型;
- 凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
Symbol 作为对象属性名时,不能用点运算符
在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号里。For..in,object.keys() 不能访问。
let id = Symbol("mytestid");
let obj = {
[id]:'symbol'
};
for(let option in obj){
console.log(obj[option]); //空
}
对象中 symbol 属性的获取方法
-
Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名。Object.getOwnPropertySymbols 方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
-
Reflect.ownKeys 方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
let id = Symbol("mytestid");
let obj = {
[id]:'symbol'
};
let array = Object.getOwnPropertySymbols(obj);
console.log(array); //[Symbol(id)]
console.log(obj[array[0]]); //'symbol'
Symbol.for Symbol.keyFor
Symbol.for:它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。
Symbol.keyFor:返回一个已登记的 Symbol 类型值的key。
let name1 = Symbol.for('name'); //检测到未创建后新建
let name2 = Symbol.for('name'); //检测到已创建后返回
console.log(name1 === name2); // true
let name1 = Symbol.for('name');
let name2 = Symbol.for('name');
console.log(Symbol.keyFor(name1)); // 'name'
console.log(Symbol.keyFor(name2)); // 'name'