Symbol
数据类型Symbol,表示独一无二的值。
对象的属性名可有两种类型,一种是原来的字符串,另一种是新增的 Symbol 类型
可以保证不与其他属性名产生冲突。
js
let s1 = Symbol()
let s2 = Symbol()
console.log(s1, s2, s1 == s2)//Symbol() Symbol() false
可以接受一个字符串作为参数,表示对 Symbol 实例的描述
js
let s1 = Symbol('foo');
如果 Symbol 的参数是一个对象,就会调用该对象的toString
方法
js
const obj = {
toString() {
return 'abc';
}
};
const sym = Symbol(obj);
sym // Symbol(abc)
Symbol.prototype.description
读取Symbol的描述
js
const sym = Symbol('foo')
sym.description //foo
作为属性名
js
let mySymbol = Symbol();
let a = {};a[mySymbol] = 'Hello!';
let a = {let a = {};};
let a = {};Object.defineProperty(a, mySymbol, { value: 'Hello!' });
属性名的遍历
Symbol 作为属性名,遍历对象的时候,该属性不会出现在for...in
、for...of
循环中,也不会被Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回
Object.getOwnPropertySymbols()
方法,可以获取指定对象的所有 Symbol 属性名。该方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
js
const objectSymbols = Object.getOwnPropertySymbols(obj);
Reflect.ownKeys()
方法可以返回所有类型的键名,包括常规键名和 Symbol 键名
js
let obj = {
[Symbol('my_key')]: 1,
enum: 2,
nonEnum: 3
};
Reflect.ownKeys(obj)
// ["enum", "nonEnum", Symbol(my_key)]
Symbol.for()
Symbol("cat")
每次调用都会返回一个新的值。
Symbol.for()
会先检查给定的key
是否已经存在,存在:每次都会返回同一个 Symbol 值;如果不存在:才会新建一个值。
js
Symbol.for("bar") === Symbol.for("bar")// true
Symbol("bar") === Symbol("bar")
// false
由于
Symbol()
写法没有登记机制,所以每次调用都会返回一个不同的值。
Symbol.keyFor()
Symbol.keyFor()
方法返回一个已登记的 Symbol 类型值的key
。
js
let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
注意,Symbol.for()
为 Symbol 值登记的名字,是全局环境的,不管有没有在全局环境运行。