日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript中的symbol对象

發布時間:2023/12/16 javascript 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。