标签:define ref value val == 括号 必须 efi 参数
原始数据类型,表示独一无二的值
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‘
标签:define ref value val == 括号 必须 efi 参数
原文地址:https://www.cnblogs.com/angle-yan/p/13371312.html