ES6的Symbol

简述

为了解决ES5对象属性名会重复的问题,ES6提出了第七种数据类型:Symbol,用来表示独一无二的值.

var s = Symbol()
console.log(typeof s); // symbol

var a = Symbol();
var b = Symbol();
console.log(a == b) // false

Symbol 函数前不能加new ,因为生成的Symbol是一个原始类型的值,不是对象
Symbol 函数可以接受一个字符串作为参数,表示对Symbol实例的描述

var s1 = Symbol('s1');
var s2 = Symbol('s2');
console.log(s1.toString()) //Symbol(s1)
console.log(s2.toString()) //Symbol(s2)

//Symbol 可以转为字符串,bool,但不能转为数值
console.log(Boolean(s1)) // true
console.log(String(s1)) // Symbol(s1)
console.log(Number(s1)) // TypeError

作为属性名

//用Symbol作为对象属性
var mySymbol  = Symbol();
//第一种写法
var a = {}
a[mySymbol] = 'Hello';

// 第二种写法,需要在mySymbol外面套一层[]
var a = {
    [mySymbol]:'Hello'
}

// 第三种写法
var a = {};
Object.defineProperty(a, mySymbol, {
    value:'Hello'
})
console.log(a[mySymbol]);

属性名的遍历

Symbol作为属性名是不会出现在for…in、for…of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()返回但它不是一个私有属性,可以通过Object.getOwnPropertySymbols获取这个对象的所有Symbol属性名

var obj ={}
var a = Symbol('a')
var b = Symbol("b")
obj[a] = 'Hello'
obj[b] = 'World'
obj['c'] = "!"
var objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols); //[Symbol(a), Symbol(b)]
var objecyNames = Object.getOwnPropertyNames(obj);
console.log(objecyNames) // ['c']
//Relect.ownKeys
console.log(Reflect.ownKeys(obj)) //['c', Symbol(a), Symbol(b)]

Symbol.for()、Symbol.keyFor()

当我们想重新使用一个Symbol值,Symbol.for方法可以做到这一点,它接受一个字符串作为参数,然后搜索这个字符串对应的Symbol并返回
如果不存在则新建并返回一个包含该参数的Symbol

var s1 = Symbol.for('a')
var s2 = Symbol.for('a')
console.log(s1 ===s2) // true
// Symbol.keyFor则是返回一个已登记的Symbol类型值的key
console.log(Symbol.keyFor(s1)) //'a'
var s1 = Symbol()
console.log(Symbol.keyFor(s1)) //undefined

参考

《ES6标准入门》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值