簡(jiǎn)述
ES5的對(duì)象屬性名都是字符串,為了 不引起屬性名的混用和保證屬性名的獨(dú)一無二,進(jìn)而引入了Symbol。
Symbol是javascript的第7種數(shù)據(jù)類型,表示獨(dú)一無二的值
var s = Symbol();
console.log(typeof s);//'symbol'
Symbol函數(shù)不能使用new命令,否則會(huì)報(bào)錯(cuò).因?yàn)镾ymbol是一種原始類型值,不是對(duì)象.
Symbol函數(shù)可以接受一個(gè)字符串作為參數(shù),表示對(duì)Symbol實(shí)例的描述,主要是為了在控制臺(tái)顯示,或者轉(zhuǎn)為字符串時(shí),比較容易區(qū)分。
var s = Symbol('lalal');
console.log(s); // Symbol(lalal)
注:Symbol函數(shù)的參數(shù)只是表示對(duì)當(dāng)前Symbol值的描述,因此相同參數(shù)的Symbol函數(shù)的返回值是不等的.
// 沒有參數(shù)的情況
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有參數(shù)的情況
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2 // false
Symbol不能與其他類型的值進(jìn)行運(yùn)算,會(huì)報(bào)錯(cuò)
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不能運(yùn)用點(diǎn)運(yùn)算符
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,如何取值呢