ES6——Symbol
Posted angle-yan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6——Symbol相关的知识,希望对你有一定的参考价值。
原始数据类型,表示独一无二的值
let sy = Symbol(‘kk‘)
console.log(sy) //Symbol(kk)
typeof(sy) //‘Symbol‘
相同参数 Symbol() 返回的值不相等
let sy1 = Symbol(‘kk‘)
sy == sy1 //false
-
用做属性名
每一个 Symbol 的值是不相等的,保证属性名不重复
//方法1 let sy = Symbol(‘key1‘) let obj = {} obj[sy] = ‘kk‘ console.log(obj) //{Symbol(key1):‘kk‘} //方法2 let obj = { [sy]: ‘kk‘ } //方法3 Object.defineProperty(obj,sy,{value:‘kk‘})
注 : Symbol 作为对象属性名不能用点运算符,必须用方括号
Symbol 作为属性名,该属性为共有属性,可在类的外部访问,但不会出现在
for...in
,for...of
循环中,也不会被Object.keys()
Object.getOwnPropertyNames()
返回。但可通Object.getOwnPropertySymbols()
和Reflect.ownKeys()
取到let sy = Symbol(‘key1‘) let obj = { [sy]: ‘kk‘ } for(let i in obj){ //不会进入循环 console.log(i) } console.log(Object.keys(obj)) //[] console.log(Object.getOwnPropertySymbols(obj)) //[Symbol(key1)] console.log(Reflect.ownKeys(obj)) //[Symbol(key1)]
-
方法
-
Symbol.for()
首先在全局搜索被登记的Symbol中是否有该字符串参数作为名称的 Symbol 值,如果有即返回 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值并登记在全局中供搜索
let sy = Symbol(‘kk‘) let sy2 = Symbol.for(‘kk‘) sy == sy2 //false let s3 = Symbol.for(‘kk‘) sy2 == sy3 //true
注 : 初始化的 Symbol 的变量并不会在全局中登记
-
Symbol.keyFor()
返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。
Symbol.keyFor(sy) //undefined Symbol.sy2(sy2) //‘kk‘
-
以上是关于ES6——Symbol的主要内容,如果未能解决你的问题,请参考以下文章