简述
ES5的对象属性名都是字符串,为了 不引起属性名的混用和保证属性名的独一无二,进而引入了Symbol。
Symbol是javascript的第7种数据类型,表示独一无二的值
var s = Symbol();
console.log(typeof s);//'symbol'
Symbol函数不能使用new命令,否则会报错.因为Symbol是一种原始类型值,不是对象.
Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
var s = Symbol('lalal');
console.log(s); // Symbol(lalal)
注:Symbol函数的参数只是表示对当前Symbol值的描述,因此相同参数的Symbol函数的返回值是不等的.
// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2 // false
Symbol不能与其他类型的值进行运算,会报错
var sym = Symbol('My symbol');
String(sym) // 'Symbol(My symbol)'
sym.toString() // 'Symbol(My symbol)'
var sym = Symbol();
Boolean(sym) // true
!sym // false
作为属性名的Symbol
let width = Symbol(),
height = Symbol();
let o = {};
o[width] = '200px';
console.log(o); // Object {Symbol(): "200px"}
console.log(o.width); // undefined
console.log(o[width]); //200px
//注1:Symbol不能运用点运算符
o.width = '1280px';
console.log(o); //Object {width: "1280px", Symbol(): "200px", Symbol(): "300px", Symbol(top): 0}
//注2:另一种赋值的方法,使用Object.defineProperty()的方法
Object.defineProperty(o, height, {
value: '300px'
}); // Object {width: "1280px", Symbol(): "300px"}
console.log(o);
//注3:另一种定义Symbol值的方式
o[Symbol('top')] = 0;
console.log(o); //Object {width: "1280px", Symbol(): "300px", Symbol(top): 0}
console.log(o[top]); //undefined;
console.log(o[Symbol('top')]); //undefined;??why,如何取值呢