ES6引入了一種新的原始數(shù)據(jù)類型Symbol,表示獨一無二的值,最大的用法是用來定義對象的唯一的屬性名。
基本用法
Symbol函數(shù)棧不能用new命令,因為Symbol是原始數(shù)據(jù)類型,不是對象??梢越邮芤粋€字符串作為參數(shù),為新創(chuàng)建的Symbol提供描述,用來顯示控制臺或者作為字符串的時候使用,便于區(qū)分。
let sy = Symbol('kk')
console.log(sy); // Symbol('kk')
typeof(sy) // symbol
//相同參數(shù)Symbol()返回的值不相等
let sy1 = Symbol('kk')
sy === sy1 // false
使用場景
作為屬性名
由于每個Symbol的值都是不相等的,所以它作為對象的屬性名,可以保證屬性不重名
let sy = Symbol("key1");
// 寫法1
let syObject = {};
syObject[sy] = "kk";
console.log(syObject); // {Symbol(key1): "kk"}
// 寫法2
let syObject = {
[sy]: "kk"
};
console.log(syObject); // {Symbol(key1): "kk"}
// 寫法3
let syObject = {};
Object.defineProperty(syObject, sy, {value: "kk"});
console.log(syObject); // {Symbol(key1): "kk"}
Symbol作為對象屬性名時不能用 . 運算符,要用方括號。因為 . 運算符后面是字符串,所以渠道的是字符串sy屬性,,而不是Symbol值sy屬性。
let syObject = {};
syObject[sy] = "kk";
syObject[sy]; // "kk"
syObject.sy; // undefined
注意點
Symbol值作為屬性名時,該屬性是公有屬性不是私有屬性,可以在類得外部訪問。但是不會出現(xiàn)在for...in for...of 的循環(huán)中,也不會被Object.keys() Object.getOwnPropertyNames()返回。如果要讀取一個對象的Symbol屬性,可以通過Object.getOwnPropertySymbols()和Reflect.ownKeys()取到。
let syObject = {};
syObject[sy] = "kk";
console.log(syObject);
for (let i in syObject) {
console.log(i);
} // 無輸出
Object.keys(syObject); // []
Object.getOwnPropertySymbols(syObject); // [Symbol(key1)]
Reflect.ownKeys(syObject); // [Symbol(key1)]
定義常量
在ES5使用字符串表示常量。但是用字符串不能保證常量是獨特的,Symbol 的值是唯一的,所以不會出現(xiàn)相同值得常量。
Symbol.for()
Symbol.for()類似單例模式,首先會在全局搜索被登記的Symbol中是否有該字符串參數(shù)作為名稱的Symbol值,如果有即返回該值,若沒有則新建并返回該字符串參數(shù)為名稱的Symbol值,并登記在全局環(huán)境中供搜索。
let yellow = Symbol("Yellow");
let yellow1 = Symbol.for("Yellow");
yellow === yellow1; // false
let yellow2 = Symbol.for("Yellow");
yellow1 === yellow2; // true
Symbol.keyFor()
Symbol.keyFor()返回一個已登記得Symbol類型值得Key,用來檢測字符串參數(shù)作為名稱得Symbol值是否已被登記。
let yellow1 = Symbol.for("Yellow");
Symbol.keyFor(yellow1); // "Yellow"