javascript
JavaScript中的symbol对象
前言
在學習過程中看到了一種新的數據類型 --- symbol
于是我查看一些資料和官方文檔,對symbol的相關知識寫一篇博文
一、symbol是什么?
Symbol為ES6新增的基本數據類型,表示獨一無二的值,,最大的用法是用來定義對象的唯一屬性名。
基本數據類型有七種:(string,number,boolean,null,undefined,es6后新增 symbol和bigint)
引用數據類型有一種:(object),它包含array,function,Data,RegExp....等引用類型
注意:
symbol?是數據類型 而不是對象
定義的時候可以接受一個字符串作為參數 作為標識
Symbol類型屬于ES6中新增的基本數據類型之一,內部沒有construtor構造器,不能使用new關鍵字創建
所以new Symbol()的時候會報錯:?Symbol is not a constructor
?
查看關于symbol的文檔
二、屬性
內容參考文檔 :關于symbol的文檔
Symbol.length? ? 長度屬性,值為0。
Symbol.prototype?(en-US)
symbol構造函數的原型。
除了自己創建的symbol,JavaScript還內建了一些在ECMAScript 5 之前沒有暴露給開發者的symbol,它們代表了內部語言行為。它們可以使用以下屬性訪問:
迭代 symbols?Symbol.iterator
一個返回一個對象默認迭代器的方法。被?for...of?使用。
Symbol.asyncIterator?Experimental
一個返回對象默認的異步迭代器的方法。被?for await of?使用。
正則表達式 symbols?Symbol.match
一個用于對字符串進行匹配的方法,也用于確定一個對象是否可以作為正則表達式使用。被?String.prototype.match()?使用。
Symbol.replace
一個替換匹配字符串的子串的方法. 被?String.prototype.replace()?使用。
Symbol.search
一個返回一個字符串中與正則表達式相匹配的索引的方法。被String.prototype.search()?使用。
Symbol.split
一個在匹配正則表達式的索引處拆分一個字符串的方法.。被?String.prototype.split()?使用。
其他 symbols?Symbol.hasInstance
一個確定一個構造器對象識別的對象是否為它的實例的方法。被?instanceof?使用。
Symbol.isConcatSpreadable
一個布爾值,表明一個對象是否應該flattened為它的數組元素。被?Array.prototype.concat()?使用。
Symbol.unscopables
擁有和繼承屬性名的一個對象的值被排除在與環境綁定的相關對象外。
Symbol.species
一個用于創建派生對象的構造器函數。
Symbol.toPrimitive
一個將對象轉化為基本數據類型的方法。
Symbol.toStringTag
用于對象的默認描述的字符串值。被?Object.prototype.toString()?使用。
三、方法
Symbol..for()
Symbol.for(key)?方法會根據給定的鍵?key,來從運行時的?symbol 注冊表中找到對應的 symbol,如果找到了,則返回它,否則,新建一個與該鍵關聯的 symbol,并放入全局?symbol 注冊表中。
Symbol..KeyFor()
Symbol.keyFor(sym)?方法用來獲取全局symbol 注冊表中與某個 symbol 關聯的鍵。
var s1 = Symbol('a'); var s2 = Symbol('a'); var s3 = Symbol.for('b');//找不到key=b的symbol,新創建一個key為b的symbol var s4 = Symbol.for('b'); //找到s3剛創建的symbol console.log(typeof s1);...① //typeof s1 = 'symbol' symbol為es6新增類型 console.log(s1==s2); ...② //symbol類型每個都是獨一無二的 console.log(s3==s4); ...③ //s3,s4的key都是b,都找到同一個symbol,true注意:
Symbol.keyFor()在全局注冊表中找,而Symbol()創建的不會放在全局注冊表中,每次都是新建,
Symbol()是在全局注冊表中搜索 搜索到返回 搜索不到新建之后放在全局注冊表中
四、原型
4.1 實例屬性
所有 Symbols 繼承自?Symbol.prototype?(en-US).
一個只讀的字符串,意為對該 Symbol 對象的描述
4.2 實例方法
Symbol.prototype.toSource
返回該 Symbol 對象的源代碼。該方法重寫了?Object.prototype.toSource?方法
Symbol.prototype.toString
返回一個包含著該 Symbol 對象描述的字符串。該方法重寫了?Object.prototype.toString?方法
Symbol.prototype.valueOf
返回該 Symbol 對象。該方法重寫了?Symbol.prototype.valueOf?方法
Symbol.prototype[@@toPrimitive]
返回該 Symbol 對象。
五、示例
5.1對symbol對象使用 typeof 運算符
typeof?運算符能幫助你識別 symbol 類型
typeof Symbol() === 'symbol' typeof Symbol('foo') === 'symbol' typeof Symbol.iterator === 'symbol'5.2 symbol類型轉換
當使用 symbol 值進行類型轉換時需要注意一些事情:
- 嘗試將一個 symbol 值轉換為一個 number 值時,會拋出一個?TypeError?錯誤? (e.g.?+sym?or?sym | 0).
- 使用寬松相等時,?Object(sym) == sym?returns?true.
- 這會阻止你從一個 symbol 值隱式地創建一個新的 string 類型的屬性名。例如,Symbol("foo") + "bar"?將拋出一個?TypeError?(can't convert symbol to string).
- "safer"?String(sym)?conversion?的作用會像symbol類型調用?Symbol.prototype.toString()?一樣,但是注意?new String(sym)?將拋出異常。
5.3 symbol 與 for...in 迭代
Symbols 在?for...in?迭代中不可枚舉。另外,Object.getOwnPropertyNames()?不會返回 symbol 對象的屬性,但是你能使用?Object.getOwnPropertySymbols()?得到它們。
var obj = {};obj[Symbol("a")] = "a"; obj[Symbol.for("b")] = "b"; obj["c"] = "c"; obj.d = "d";for (var i in obj) {console.log(i); // logs "c" and "d" }5.4 symbol 與 JSON.stringify()
當使用 JSON.stringify() 時,以 symbol 值作為鍵的屬性會被完全忽略:
JSON.stringify({[Symbol("foo")]: "foo"}); // '{}'更多細節可以查看?JSON.stringify文檔
5.5 symbol 包裝器對象作為屬性的鍵
當一個 Symbol 包裝器對象作為一個屬性的鍵時,這個對象將被強制轉換為它包裝過的 symbol 值:
var sym = Symbol("foo"); var obj = {[sym]: 1}; obj[sym]; // 1 obj[Object(sym)]; // still 1總結:
以上就是今天要講的內容,本文簡單介紹了symbol的相關內容。需要詳細學習可參考下方鏈接
參考:Symbol - JavaScript | MDN (mozilla.org)
本人是初入前端的小菜鳥,文章如有錯誤,懇請大家提出問題,本人不勝感激
文章對大家有幫助的話,希望大家能動動手點贊鼓勵,未來一起努力 ? ? 長路漫漫,道阻且長 ? ??
轉載請注明出處:https://blog.csdn.net/qq_52855464/article/details/124363241
總結
以上是生活随笔為你收集整理的JavaScript中的symbol对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSDN日报20170325——《一篇文
- 下一篇: JS实现浏览器菜单命令