Symbol

新的原始数据类型 :表示独一无二的值

  • 创建方式一
var name1 = Symbol() // 不传入任何值
  • 创建方式二
var age1 = Symbol('age') // 传入key值增强代码阅读性

据以上2种创建方式我们来看看它是怎么独一无二的


image.png

var name1 = Symbol()
var name2 = Symbol()
name1 === name2 // false
var age1 = Symbol('age')
var age2 = Symbol('age')
age1 === age2 //false

 

作为对象的属性

基于Symbol独一无二的特点,我们可以将其用于创建对象的属性,尤其当一个对象由多个人修改时,很容易造成重名,Symbol可以解决这种冲突。

// 方式一
var name1 = Symbol('name')
var obj = {
[name]: 'obj'
}

// 方式二
var name1 = Symbol('name')
var obj = {}
obj[name] =  'obj'

// 方式三
var name1 = Symbol('name')
var obj = {}
Object.defineProperty(obj, name1, {
value: 'obj'
})

// 以上写法都得到同样结果
obj[name1] // "obj!"

遍历对象的属性

var name1 = Symbol('name')
var obj = {
[name1]: 'obj',
age: 12
}
Object.getOwnPropertyNames(obj) // ['age'], 拿不到Symbol定义的属性
Object.getOwnPropertySymbols(obj) // [Symbol(name)] ,拿不到普通的属性
Reflect.ownKeys(obj) // ["age", Symbol(name)]

访问对象属性

var obj = {
[Symbol('name')]: 'obj',
age: 12
}
obj['age'] // 12
obj[Symbol('name')] // 访问不到

因此,做封装时可将Symbol创建的属性作为私有属性,避免暴露出去。

for和keyFor
如果我们希望使用同一个Symbol值怎么办?

  • 创建方式三: 使用for创建全局Symbol
var s1 = Symbol.for('name')
var s2 = Symbol.for('name')
s1 === s2 // true, 无论使用多少次 Symbol.for('name'),返回的都是同一个
Symbol.keyFor(s1) // name
Symbol.keyFor(s2) // name
// 使用keyFor获取描述

注意:


image.png

其他内置属性
参考http://es6.ruanyifeng.com/#docs/symbol


另附:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值