ES6引入了一種新的原始數據類型,表示獨一無二的值,最大的用處是做爲對象屬性的惟一標識符。瀏覽器
至此,Javascript擁有6種基本數據類型和一種複雜數據類型。spa
基本類型調試
複雜類型code
Symbol([description])
let s = Symbol('test'); let s2 = Symbol('test'); let s3 = new Symbol('test'); // TypeError console.log(s === s2); // false console.log(typeof s); // symbol console.log(s.description); // test
Symbol
不支持new
調用使用Symbol.for()能夠建立全局單例的symbol值,語法以下:對象
Symbol.for([name])
const name = Symbol('name'); const name2 = Symbol.for('name'); const name3 = Symbol.for('name'); console.log(name === name2); // false console.log(name2 === name3); // true
全局Symbol映射關係中name是做爲字符串來使用的,結構相似下面的代碼:ip
const globalSymbols = { name: Symbol('name') };
使用Symbol.keyFor()能夠檢測給定的symbol值是不是全局單例的symbol(簡單來講就是檢測是不是Symbol.for()建立的),語法以下:字符串
Symbol.keyFor(symbol)
const s = Symbol('s1'); const s2 = Symbol.for('s2'); console.log(Symbol.keyFor(s)); // undefined console.log(Symbol.keyFor(s2)); // s2
Symbol類型的屬性不會參與JSON的序列化
const name = Symbol('name'); const obj = { [name]: 'xialei', data: 1 }; console.log(JSON.stringify(obj)); // {"data": 1}
Symbol類型的屬性不會出如今for ... in和for ... of循環中
const name = Symbol('name'); const user = { [name]: 'xialei', data: 1 }; for(let i in user) { console.log(i, user[i]); } // 上述循環輸出 data 1 for(let i of user) { console.log(i, user[i]); } // TypeError: user不是可迭代對象
Symbol類型的屬性不會出如今Object.keys()和Object.getOwnPropertyNames()返回結果中
const name = Symbol('name'); const user = { [name]: 'xialei', data: 1 }; console.log(Object.keys(user)); // ["data"] console.log(Object.getOwnPropertyNames(user)); // ["data"]
Symbol類型的屬性會出如今Object.Object.getOwnPropertySymbols()
const name = Symbol('name'); const user = { [name]: 'xialei', data: 1 }; console.log(Object.Object.getOwnPropertySymbols(user)); // [Symbol(name)]
const name = Symbol('1'); console.log(name + 1); // TypeError console.log(Number(name)); // 建立包裝對象 console.log(name + '1'); // TypeError console.log(String(name)); // Symbol(1) console.log(!!name); // true console.log(Boolean(name)); // true