js基础类型Symbol的应用场景

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

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值