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
是否全局登记过
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
}
欢迎点赞~