在ES5及早期的版本中桥氏,語(yǔ)言包含五種原始類型:字符串 數(shù)字 布爾 null 和 undefined。ES6引入了第6種原始類型:Symbol胀滚。
創(chuàng)建Symbol
let firstName = Symbol();
let person = {};
person[firstName] = 'dududu'
console.log(person[firstName])
創(chuàng)建了一個(gè)名為firstName的Symbol巍佑,每當(dāng)要訪問這個(gè)屬性的時(shí)候一定要用到最初定義的Symbol纷宇。
Symbol函數(shù)接受一個(gè)可選參數(shù)硕舆,其可以讓你添加一段文本描述創(chuàng)建的這個(gè)Symbol秽荞,這段描述不可用于屬性訪問。
let firstName = Symbol('firstName');
let person = {};
person[firstName] = 'dududu'
console.log(person[firstName])
console.log(firstName) // Symbol(firstname)
Symbol的描述被存儲(chǔ)在[[Description]]
屬性中抚官,只有當(dāng)調(diào)用Symbol的toString()
方法才讀取這個(gè)屬性扬跋。我們?cè)趫?zhí)行console.log
時(shí)候,隱式的調(diào)用了firstName的toString()
方法凌节,不能直接在代碼里訪問[[Description]]
屬性钦听。
Symbol的使用方法
所有使用可計(jì)算屬性名的地方都可以使用Symbol。
let firstname = Symbol('firstname');
// 使用一個(gè)可計(jì)算對(duì)象字面量屬性
let person1 = {
[firstname]: 'dududu'
}
let lastName = Symbol('lastName');
Object.defineProperties(person1, {
[lastName]: {
value: 'dudu'
}
})
console.log(person1[firstname]);
console.log(person1[lastName]);
Symbol共享體系
有時(shí)候我們希望可以在不同的代碼中共享同一個(gè)Symbol倍奢,ES6提供了一個(gè)可以隨時(shí)訪問的全局的Symbol注冊(cè)表朴上。
使用Symbol.for()
方法,它接受一個(gè)參數(shù)卒煞,也就是即將創(chuàng)建的Symbol的字符串的標(biāo)識(shí)符痪宰,同樣也被用作Symbol的描述符。
Symbol.for()
首先在全局Symbol的注冊(cè)表中搜索鍵為“uid”的Symbol是否存在,如果存在酵镜,直接返回已有的Symbol碉碉;否則創(chuàng)建一個(gè)新的Symbol柴钻。
let uid = Symbol.for('uid');
let object = {
[uid] : '12345'
}
let uid2 = Symbol.for('uid');
console.log(uid === uid2);
還有一個(gè)與Symbol共享有關(guān)的體系:可以使用Symbol.keyFor()
方法在 Symbol全局注冊(cè)表中檢出與 Symbol有關(guān)的鍵淮韭。
let uid = Symbol.for('uid');
console.log(Symbol.keyFor(uid));
let uid2 = Symbol.for('uid');
console.log(Symbol.keyFor(uid2));
let uid3 = Symbol('uid');
console.log(Symbol.keyFor(uid3));
uid與uid2都返回了uid這個(gè)鍵,而在Symbol全局注冊(cè)表中不存在uid3這個(gè)Symbol贴届,也就是不存在與之有關(guān)的鍵靠粪,所以返回unfefined。
Symbol與類型強(qiáng)制轉(zhuǎn)換
因?yàn)槠渌愋蜎]有與Symbol邏輯等價(jià)的值毫蚓,因此不能將Symbol強(qiáng)制轉(zhuǎn)換成字符串與數(shù)字占键。
可以調(diào)用Symbol的String方法并輸出Symbol的描述信息。
Symbol屬性檢索
ES6中增加了Object.getOwnPropertySymbols()
方法檢索對(duì)象中的Symbol屬性元潘。
let uid = Symbol.for('uid');
let object = {
[uid]: '12345'
}
let symbols = Object.getOwnPropertySymbols(object);