Symbol學習

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"
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 概述 ES5的對象屬性名都是字符串,這容易造成屬性名的沖突。比如,你使用了一個他人提供的對象,但又想為這個對象添加...
    oWSQo閱讀 592評論 1 3
  • 1.概述 ES5的對象屬性名都是字符串,這容易造成屬性名的沖突。比如,你使用了一個他人提供的對象,但又想為這個對象...
    趙然228閱讀 881評論 2 10
  • 概述 ES5 的對象屬性名都是字符串,這容易造成屬性名的沖突。比如,你使用了一個他人提供的對象,但又想為這個對象添...
    米諾zuo閱讀 421評論 0 0
  • 一、概述 ES6 引入了一種新的原始數(shù)據(jù)類型 Symbol,表示獨一無二的值。Symbol值通過 Symbol 函...
    了凡和纖風閱讀 282評論 0 0
  • 早晨我特意早起,由我來喊丫頭起床。因為我想抱抱她,跟她交流一下。 昨晚我們之間發(fā)生了一點不愉快。她向我請教《小桔燈...
    小懶同學閱讀 454評論 1 2

友情鏈接更多精彩內容