Es6新类型Symbol有什么用?Object.getOwnPropertySymbols()是做什么用的?Symbol.for()有什么用?如何创建一个全等的symbol?

24 篇文章 0 订阅
5 篇文章 0 订阅

Symbol有什么用?

1.防止变量名起冲突

const s1 = Symbol()
const s2 = Symbol()
 
console.log(s1 === s2); //false

2.避免魔术字符串

什么是魔术字符串?
在代码中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。

  function getFn(val) {
            switch (val) {
                case 'magicString':
                    return ['this', 'is', 'magicString']
                default:
                    return []
            }
        }
        let data = getFn('magicString')
        // 'magicString' 就是魔术字符串

风格良好的代码,应该尽量消除魔术字符串,改成含义清晰的变量代替。
3. 定义不重复的常量
4. symbol作为键名时,不被常规方法遍历出来,因此可以给对象定义非私有,但只用于内部使用的方法和属性

如何使用Symbol?

description

// 基本定义
const s1 = Symbol()
const s2 = Symbol('aaa')

console.log(s1) // Symbol()
console.log(s2) // Symbol(aaa)
// 也可以加一个description 只获取里面描述的参数
console.log(s2.description) // aaa

symbbol作为key

// 写法1
const s1 = Symbol()
const s2 = Symbol('ccc')
const s3 = Symbol('aaa')

const obj = {
  [s1]:'abc',
  [s2]:'cba'
}
// 写法2
 
obj[s3] = 'bca'

效果
在这里插入图片描述

怎么样获取到这些Symbol类型的参数呢?

通过Object.getOwnPropertySymbols(),作用:方法返回一个给定对象自身的所有 Symbol 属性的数组

// Object.getOwnPropertySymbols获取symbol的所有key
console.log(Object.getOwnPropertySymbols(obj));
// [Symbol(), Symbol(ccc), Symbol(aaa)]

// 通过key来获取obj里的参数
const arr = Object.getOwnPropertySymbols(obj)
console.log(obj[arr[0]]); // abc

Symbol.for()

Symbol.for(key) 方法会根据给定的键 key,来从运行时的 symbol注册表中找到对应的symbol,如果找到了,则返回它,否则,新建一个与该键关联的symbol,并放入全局 symbol 注册表中。
语法

Symbol.for(key)

参数
一个字符串,作为 symbol 注册表中与某 symbol 关联的键(同时也会作为该 symbol 的描述)。

如何创建一个全等的Symbol

// 这样能创造两个全等的symbol
const sa = Symbol.for('aaa')
const sb = Symbol.for('aaa')
console.log(sa === sb); //true
//Symbol.keyFor(sym) 方法用来获取全局symbol 注册表中与某个 symbol 关联的键。
console.log(Symbol.keyFor(sa )); //aaa

//以下不是保存在全局Symbol注册表中的
var localSym = Symbol();  // 因为没有描述symbol
Symbol.keyFor(localSym); // undefined,
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值