Symbol的出现是因为没有可以用来表示唯一的标识符,所以从根本上防止属性名的冲突,所以引入了Symbol。所以对象的属性名可以有两种类型,一种是通常的字符串,另一种是新增的Symbol类型。
Symbol是一种新的原始数据类型,用Symbol函数生成,用typeof运算符的结果是'symbol'。它是一种原始数据类型,不是对象,所以Symbol函数前不能用new命令。而且Symbol值不能与其他类型的值进行运算。
// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有参数的情况
var s1 = Symbol('foo');
var s2 = Symbol('foo');
s1 === s2 // false
当Symbol值作为对象属性名时,不能用点运算符
var mySymbol = Symbol();
var a = {};
a.mySymbol = 'Hello!';
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"
Symbol作为属性名,是不会被for...in,for..of,Object.keys(), Object.getOwnPropertyNames,JSON.stringify()解析的,但是它有一个私有属性: Object.getOwnPropertySymbols,这个可以获取Symbol的属性名。另外Reflect.ownKeys 这个方法可以获取所有类型的属性名。
Symbol的方法
Symbol.for():可以使用同一个symbol值,它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。
var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');
s1 === s2 // true
Symbol.for("bar") === Symbol.for("bar")
// true
Symbol("bar") === Symbol("bar")
// false
Symbol.keyFor(): 返回一个已经登记的Symbol类型的key值
hasInstance
isConcatSpreadable
species
match
replace
search
split
iterator
toPrimitive
unscopables
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。