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


jyren_Rachel
107 声望4 粉丝

下一篇 »
ES6: Proxy