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