Symbol
数据类型简单介绍
Symbol
通过声明
Symol
,可以形成一个
独一无二
的值。
将这个值用于对象中,可以避免key的重复。
3种声明方式&各自的特点
方法一,
Symbol()
- 重复声明则每次都会生成独一无二的值,互不相等。
-
在控制台的输出都是
Symbol()
,不利于区分。 - 未登记在全局。
let s1 = Symbol()
方法二,添加了用于描述的字符串
- 重复声明则每次都会生成独一无二的值,互不相等。
- 在控制台的输出包含括号内的参数,利于区分。
- 未登记在全局。
let s1 = Symbol('foo')
方法三,
Symbol.for
-
定义在全局的环境中,
声明多次实则生成一个
。 - 在控制台的输出包含括号内的参数,利于区分。
let s1 = Symbol.for('foo')
let s2 = Symbol.for('foo')
console.log(s1 === s2) // true
Symbol.keyFor(**)
Symbol.keyFor(**)
作用
:用于检验
Symbol
是否全局登记过
const s1 = Symbol('foo')
console.log(Symbol.keyFor(s1)) // undefined
const s2 = Symbol.for('foo')
console.log(Symbol.keyFor(s2)) // foo
使用场景
一
将
Symbol
作为对象的
key
,以保证对象的
key
不冲突
如不使用
Symbol
,相同的key,后者会覆盖前者。
const stu1 = Symbol('小王')
const stu2 = Symbol('小王')
const grade = {
[stu1]: {address: 'yyy', tel: '222'},
[stu2]: {address: 'zzz', tel: '333'},
}
console.log(grade)
// {
// [Symbol(小王)]: { address: 'yyy', tel: '222' },
// [Symbol(小王)]: { address: 'zzz', tel: '333' }
// }
二
-
定义类(
class
)时,使用
Symbol
定义的实例属性,可以被实例方法引用,不能被
forin
、
Object.keys
遍历,
forin
、
Object.keys
仅能遍历普通实例属性; -
Object.getOwnPropertySymbols
只能获取到
Symbol
属性; -
Reflect.ownKeys
方法可遍历普通实例属性以及
Symbol
定义的实例属性。
三
用于消除魔术字符串,使用
Symbol
数据类型替换普通字符串。
const shapeType = {
triangle: Symbol(),
circle: Symbol()
}
function getArea(shape) {
let area = 0
switch (shape) {
case shapeType.triangle:
area = 1
break
case shapeType.circle:
area = 2
break
}
return area
}
欢迎点赞~
版权声明:本文为weixin_46557501原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。