简述
为了解决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标准入门》