ES5对象属性名都是字符串容易造成属性名的抵触。
eg:var a = { name: 'lucy'};a.name = 'lili';这样就会重写属性
ES6引入了一种新的原始数据类型Symbol,示意举世无双的值。
从新温习下新常识:根本数据类型有6种:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
这里新增加了一种:Symbol
留神,Symbol
函数前不能应用new
命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象
Symbol
函数能够承受一个字符串作为参数,示意对Symbol实例的形容,次要是为了在控制台显示,或者转为字符串时,比拟容易辨别。
// 没有参数的状况var s1 = Symbol(); var s2 = Symbol();s1 === s2 // false// 有参数的状况var s1 = Symbol("foo"); var s2 = Symbol("foo");s1 === s2 // false
Symbol值不能与其余类型的值进行运算
作为属性名的Symbol
var mySymbol = Symbol(); // 第一种写法var a = {};a[mySymbol] = 'Hello!'; // 第二种写法var a = { [mySymbol]: 'Hello!' }; // 第三种写法var a = {};Object.defineProperty(a, mySymbol, { value: 'Hello!' }); // 以上写法都失去同样后果a[mySymbol] // "Hello!"
留神,Symbol值作为对象属性名时,不能用点运算符。
var a = {}; var name = Symbol();a.name = 'lili';a[name] = 'lucy';console.log(a.name,a[name]); //lili,lucy
Symbol值作为属性名时,该属性还是公开属性,不是公有属性。
这个有点相似于java中的protected属性(protected和private的区别:在类的内部都是不能够拜访的,在类内的子类能够继承protected不能够继承private)
然而这里的Symbol在类内部也是能够拜访的,只是不会呈现在for...in
、for...of
循环中,也不会被Object.keys()
、Object.getOwnPropertyNames()
返回。但有一个Object.getOwnPropertySymbols
办法,能够获取指定对象的所有Symbol属性名
Symbol.for(),Symbol.keyFor()
Symbol.for机制有点相似于单例模式,首先在全局中搜寻有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。和间接的Symbol就点不同了。
var s1 = Symbol.for('foo'); var s2 = Symbol.for('foo');s1 === s2 // true</pre>
Symbol.keyFor办法返回一个已登记的Symbol类型值的key。本质就是检测该Symbol是否已创立
var s1 = Symbol.for("foo");Symbol.keyFor(s1) // "foo"var s2 = Symbol("foo");Symbol.keyFor(s2) // undefined</pre>