es6学习--symbol
ES6 引入了一种新的原始数据类型Symbol
,表示独一无二的值.注意,Symbol
函数前不能使用new
命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
let s = Symbol(); console.log(typeof s); // symbol
1.作为属性名去使用
由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。
注意,Symbol 值作为对象属性名时,不能用点运算符。
let mySymbol = Symbol(); //书写方式1 let a = {}; a[mySymbol] = "hello"; //书写方式2 var a = { [mySymbol]:"hello" } //书写方式3 Object.defineProperty(a,mySymbol,{value:"hello"});
在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中,如果s
不放在方括号中,该属性的键名就是字符串s
,而不是s
所代表的那个 Symbol 值。
2.属性名的遍历
Symbol 作为属性名,该属性不会出现在for...in
、for...of
循环中,
有一个Object.getOwnPropertySymbols
方法,可以获取指定对象的所有 Symbol 属性名。
Object.getOwnPropertySymbols
方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
var a = Symbol('a'); var b = Symbol('b'); var obj = { [a]:"Hello", [b]:"world" }; console.log(Object.getOwnPropertySymbols(obj)); //[ Symbol(a), Symbol(b) ]
3.Symbol.for(),Symbol.keyFor()
我们希望重新使用同一个Symbol值,Symbol.for
方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。
Symbol.keyFor
方法返回一个已登记的 Symbol 类型值的key
。
var a = Symbol.for('aaa'); var b = Symbol.for('aaa'); var obj = { [a]:"Hello" }; console.log(a===b); //true console.log(Symbol.keyFor(a)); //aaa