新聞中心
Symbol:一種新的原始數(shù)據(jù)類型,表示獨一無二的值。

以前的數(shù)據(jù)類型可能變量不同,但是變量的值可以相同;
而Symbol類型的變量的值是獨一無二的。
原本的對象的屬性名都是字符串,還要小心發(fā)生沖突,
凡是屬性名為Symbol類型的,就是獨一無二的,可以保證不去其他屬性名沖突
ES6 數(shù)據(jù)類型除了 Number 、 String 、 Boolean 、 Objec t、 null 和 undefined ,還新增了 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 的值都是不相等的,所以 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 使用字符串表示常量。例如:
const COLOR_RED = "red";
const COLOR_YELLOW = "yellow";
const COLOR_BLUE = "blue";
但是用字符串不能保證常量是獨特的,這樣會引起一些問題:
const COLOR_RED = "red";
const COLOR_YELLOW = "yellow";
const COLOR_BLUE = "blue";
const MY_BLUE = "blue";
function ColorException(message) {
this.message = message;
this.name = "ColorException";
}
function getConstantName(color) {
switch (color) {
case COLOR_RED :
return "COLOR_RED";
case COLOR_YELLOW :
return "COLOR_YELLOW ";
case COLOR_BLUE:
return "COLOR_BLUE";
case MY_BLUE:
return "MY_BLUE";
default:
throw new ColorException("Can't find this color");
}
}
try {
var color = "green"; // green 引發(fā)異常
var colorName = getConstantName(color);
} catch (e) {
var colorName = "unknown";
console.log(e.message, e.name); // 傳遞異常對象到錯誤處理
}
但是使用 Symbol 定義常量,這樣就可以保證這一組常量的值都不相等。用 Symbol 來修改上面的例子。
const COLOR_RED = Symbol("red");
const COLOR_YELLOW = Symbol("yellow");
const COLOR_BLUE = Symbol("blue");
function ColorException(message) {
this.message = message;
this.name = "ColorException";
}
function getConstantName(color) {
switch (color) {
case COLOR_RED :
return "COLOR_RED";
case COLOR_YELLOW :
return "COLOR_YELLOW ";
case COLOR_BLUE:
return "COLOR_BLUE";
default:
throw new ColorException("Can't find this color");
}
}
try {
var color = "green"; // green 引發(fā)異常
var colorName = getConstantName(color);
} catch (e) {
var colorName = "unknown";
console.log(e.message, e.name); // 傳遞異常對象到錯誤處理
}
Symbol 的值是唯一的,所以不會出現(xiàn)相同值得常量,即可以保證 switch 按照代碼預(yù)想的方式執(zhí)行。
Symbol.for()
Symbol.for() 類似單例模式,首先會在全局搜索被登記的 Symbol 中是否有該字符串參數(shù)作為名稱的 Symbol 值,如果有即返回該 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"
網(wǎng)頁題目:講解一下ECMA Script 6之 Symbol
鏈接分享:http://www.dlmjj.cn/article/djdpigh.html


咨詢
建站咨詢
