symbol是ES6中新增的原始数据类型,表示独一无二的值。经常被用于对象的唯一属性名。
具体使用方式如下:
useEffect(() => {
console.log(type, '------------------3-----');
fn()
}, [])
const fn = () => {
// 方法1
let s1 = Symbol('key1')
let obj = { [s1]: '值1' }
console.log(obj, '-------1---'); //{Symbol(key1): '值1'}
//方法2
obj[s1] = '值2'
console.log(obj, '--------------2---'); //{Symbol(key1): '值2'}
//方法3
Object.defineProperty(obj, s1, { value: '值3' })
let o =Reflect.ownKeys(obj) //Reflect.ownKeys()
console.log(obj, o, '---------------3--'); //{Symbol(key1): '值3'} ,[Symbol(key1)]
}
在创建symbol时传入的字符串是对symbol的描述便于区分,即使创建的两个symbol传入的字符串都是’key1‘也是不等的,因为symbol是独一无二的,因此作为对象属性名时可以保证不重名。
需要注意的是 symbol是不会出现在for...in ,for...of 中,并且也不会被Object.keys() 、Object.getOwnPropertyNames() 所返回,可以用Reflect.ownKeys()和Object.getOwnPropertySymbols()获取到。
还可以用symbol来定义常量,能保证常量的独特性。
Symbol.for() 首先会在全局找是否有以该字符串为名称的symbol值,如果有则返回该值;如果没有则会在全局环境中创建一个以该字符串参数为名称的symbol值 。
Symbol.keyFor() 返回一个已经登记的symbol的key ,可用于查询是否已有这个字符串为名称登记的symbol。