symbol类型
synbol类型为es6新增数据类型,被划分到了基本数据类型中。
表示一个唯一的值。
格式为:
let xxx = symbol('标识');
symbol('')中的标识仅用于区分,无特殊意义,如果需要读取标识的话可以将symbol类型转换为字符串或者布尔值。
symbol类型也可用作对象的key:
//后面的括号可以给symbol做上标记便于识别 let name=Symbol('name'); let say=Symbol('say'); let obj= { //如果想 使用变量作为对象属性的名称,必须加上中括号,.运算符后面跟着的都是字符串 [name]: 'lnj', [say]: function () { console.log('say') } } obj.name='it666'; obj[Symbol('name')]='it666' console.log(obj)
打印出来的内容中会多出一个键值对name: 'it666';
obj[Symbol('name')]的值不会改变。而是会创建一个新的参数:symbol[name]:'it666'。
symbol的值不可以做运算,并且symbol类型只可以转换为string 或者 Boolean
console.log(String(name))
console.log(Boolean(name))
当使用symbol生成的值作为属性或者方法时需要保存下来,不然可能无法使用。因为symbol每次生成的值都是不同的
symbol作为obj的属性名的时候无法通过for循环遍历出来
for (let xx in obj) :i代表key for (let xx of obj):不是自带的哈 Object.keys(obj) :返回包含key的数组 Object.values(obj) :返回包含value的数组 Object.getOwnPropertyNames() :返回包含key的数组 上述的所有方法都是遍历不到symbol类型的(注意,是遍历时取不到symbol,并不是说我们访问不到对象的symbol类型) 可以遍历到symbol的方法: Object.getOwnPropertySymbols() :返回对象中只包含symbol类型key的数组 Reflect.ownKeys() :返回对象中所有类型key的数组(包含symbol)
只可以通过Reflect.ownKey(obj)或者Object.getOwnPropertySymbols(obj)来遍历。但是仍旧可以通过obj[symbol的标识]来访问到对应的参数。
因为symbol类型每次都会生成不同的值,所以symbol自带了一个for方法来接受一个字符串为标识,自动去搜寻此标识,如果有以此标识作为名字的值则会返回这个值,如果没有就会生成一个新值。并将其注册到全局
let s1 = Symbol('foo'); let s2 = Symbol('foo'); s1 === s2 // false let s1 = Symbol.for('foo'); let s2 = Symbol.for('foo'); s1 === s2 // true
除此之外还有一个获取标识的方法keyFor,由于Symbol()
写法没有登记机制,所以每次调用都会返回一个不同的值。Symbol.keyFor()
方法返回一个已登记的 Symbol 类型值的key
。
let s1 = Symbol.for("foo"); // 利用for()生成,已注册 Symbol.keyFor(s1) // "foo" let s2 = Symbol("foo"); // 未注册 Symbol.keyFor(s2) // undefined