Symbol作为es6新增的变量基本类型,其特性是独一无二且不可变的数据类型。在代码里的应用场景如下:
1,用来作为对象键名,相当于创建了一个私有属性
例如:
// 在a文件中创建一个Symbol变量
const symbolA = Symbol()
const objA = {
[symbolA]: '保密'
}
export default objA
// 在b文件中引入a
import objA from './a'
objA[symbolA] // symbolA is not defined,
在上面的例子中,a文件中声明的变量,b文件访问不到。但倘若不是一个Symbol变量,在b文件中是可以通过伪造相同值进行访问。比如a文件中 symbolA = ‘a1’,b文件中 const xx=‘a1’; objA[xx]或者直接 objA.a1便可访问到对应值。因为对象的键只要值相同就能访问到,而很显然,虽然是在两个文件中分别定义的String类型变量a1,其值也是相同的,但如果是Symbol(),则值是唯一的,不可伪造。
ps:不能直接访问,但还是能被遍历到。不会被Object.keys(),for…in遍历到,但可以用专门提供的API,如Object.getOwnPropertySymbols(xxobj), Reflect.ownKeys(xxobj)访问到
2,当代码里需要创建一个变量,且不关心这个变量的值是多少,只需要确保它的唯一性时,就可用Symbol
例如:
const TYPE_OBJ = {
TYPE1: Symbol(),
TYPE2: Symbol()
}
function checkType(obj) {
switch(obj) {
case TYPE_OBJ.TYPE1:
console.log('type1')
break
case TYPE_OBJ.TYPE2:
console.log('type2')
break
}
}
checkType(TYPE_OBJ)
这里与使用场景1中的差别在于,1是用Symbol变量作为对象键值对中的键,而2是用Symbol变量作为键值对中的值
3,当在有嵌套页面的场景需要共用一个Symbol时
比如iframe中的下层window中,需要使用上层window的Symbol。可以使用Symbol.for这个api。
// 在上层window中注册
let symbol1= Symbol.for(‘symbol111’) //注册一个全局Symbol
// 在下层window中获取
let symbol2= Symbol.for(‘symbol111’) //获取全局Symbol, symbol2等于symbol1