你需要知道的Symbols|世界資訊
著名symbol是一個(gè)在不同領(lǐng)域中都相同且未注冊(cè)的symbol。如果我們要列出著名symbol,它們會(huì)是:
Symbol.iteratorSymbol.toStringTagSymbol.toPrimitiveSymbol.asyncIteratorSymbol.hasInstanceSymbol.isConcatSpreadableSymbol.speciesSymbol.matchSymbol.matchallSymbol.replaceSymbol.searchSymbol.splitSymbol.unscopablesSymbol.dispose讓我們看一些例子來(lái)了解其有用性。
Symbol.iteratorSymbol.iterator
:該symbol被用來(lái)為對(duì)象定義默認(rèn)的迭代器。它被用來(lái)在for-of
循環(huán)中實(shí)現(xiàn)對(duì)對(duì)象的迭代,或用于擴(kuò)展操作符。
(資料圖片)
const obj = { a: 1, b: 2, c: 3 };obj[Symbol.iterator] = function*() { for (const key of Object.keys(this)) { yield [key, this[key]]; }};for (const [key, value] of obj) { console.log(`${key}: ${value}`);}
Symbol.toStringTagSymbol.toStringTag
:該symbol被用來(lái)指定在調(diào)用Object.prototype.toString
方法時(shí)返回的字符串值,以便為對(duì)象提供自定義的字符串表示形式。
class MyClass { static [Symbol.toStringTag] = "MyClass";}const myInstance = new MyClass();console.log(myInstance.toString()); // outputs "[object MyClass]"
Symbol.toPrimitiveSymbol.toPrimitive
:該symbol被用來(lái)指定對(duì)象在隱式調(diào)用valueOf
和toString
方法時(shí)的行為??梢杂盟鼇?lái)為對(duì)象提供自定義的字符串和數(shù)字表示形式。
class Life { valueOf() { return 42; } [Symbol.toPrimitive](hint) { switch (hint) { case "number": return this.valueOf(); case "string": return "Forty Two"; case "default": return true; } }}const myLife = new Life();console.log(+myLife); // 42console.log(`${myLife}`); // "Forty Two"console.log(myLife + 0); // 42
Symbol.asyncIteratorSymbol.asyncIterator
:該symbol被用來(lái)為對(duì)象定義一個(gè)異步的迭代器。可以用它來(lái)為對(duì)象啟用異步迭代。
class MyAsyncIterable { async *[Symbol.asyncIterator]() { for (let i = 0; i < 5; i++) { await new Promise(resolve => setTimeout(resolve, 1000)); yield i; } }}(async () => { for await (const value of new MyAsyncIterable()) { console.log(value); }})();// Output after one second:// 0// Output after two seconds:// 1// Output after three seconds:// 2// Output after four seconds:// 3// Output after five seconds:// 4
Symbol.hasInstanceSymbol.hasInstance
:該symbol被用來(lái)確認(rèn)一個(gè)對(duì)象是否是構(gòu)造函數(shù)的實(shí)例。它可以用來(lái)更改instanceof
操作符的行為。
class MyArray { static [Symbol.hasInstance](instance) { return Array.isArray(instance); }}const arr = [1, 2, 3];console.log(arr instanceof MyArray); // true
Symbol.isConcatSpreadableSymbol.isConcatSpreadable
:該symbol被用來(lái)確定對(duì)象在與其他對(duì)象連接時(shí)是否應(yīng)該被展開(kāi)。它可以用來(lái)更改Array.prototype.concat
方法的行為。
const arr1 = [1, 2, 3];const spreadable = { [Symbol.isConcatSpreadable]: true, 0: 4, 1: 5, 2: 6, length: 3 };console.log([].concat(arr1, spreadable)); // [1, 2, 3, 4, 5, 6]
Symbol.speciesSymbol.species
:該symbol被用來(lái)指定創(chuàng)建派生對(duì)象時(shí)要使用的構(gòu)造函數(shù)。它可以用來(lái)自定義創(chuàng)建新對(duì)象的內(nèi)置方法的行為。
class MyArray extends Array { static get [Symbol.species]() { return Array; }}const myArray = new MyArray(1, 2, 3);const mappedArray = myArray.map(x => x * 2);console.log(mappedArray instanceof MyArray); // falseconsole.log(mappedArray instanceof Array); // true
Symbol.matchP.S:這一功能在未來(lái)可能會(huì)被刪除。
Symbol.match
:該symbol被用來(lái)在使用String.prototype.match
方法時(shí)確定要搜索的值。它可以用來(lái)更改類似于RegExp
對(duì)象的match
方法的行為。
const myRegex = /test/;"/test/".startsWith(myRegex); // Throws TypeErrorconst re = /foo/;re[Symbol.match] = false;"/foo/".startsWith(re); // true"/bar/".endsWith(re); // false
P.S: 這個(gè)symbol的存在是標(biāo)志著一個(gè)對(duì)象是"regex"的原因。
const myRegex = /foo/g;const str = "How many foos in the the foo foo bar?";for (result of myRegex[Symbol.matchAll](str)) { console.log(result); // we will get the matches}
Symbol.replaceSymbol.replace
:該symbol被用來(lái)在使用String.prototype.replace
方法時(shí)確定替換值。它可以用來(lái)更改類似于RegExp
對(duì)象的replace
方法的行為。
const customReplace = str => str.replace(/\d+/g, match => `-${match}-`);const customString = { [Symbol.replace]: customReplace};const originalString = "foo123bar456baz";const result = originalString.replace(customString, "*");console.log(result); // outputs "foo-123-bar-456-baz"
Symbol.splitSymbol.split
:該symbol被用來(lái)在使用String.prototype.split
方法時(shí)確定分隔值。它可以用來(lái)更改類似于RegExp
對(duì)象的split
方法的行為。
const { Symbol } = require("es6-symbol");const customSplit = str => str.split(/\d+/);const customRegExp = { [Symbol.split]: customSplit};const string = "foo123bar456baz";string.split(customRegExp); // outputs [ "foo", "bar", "baz" ]
Symbol.unscopablesSymbol.unscopables
:該symbol被用于確定應(yīng)該從with
語(yǔ)句的作用域中排除哪些對(duì)象屬性。它可以用來(lái)更改with
語(yǔ)句的行為。
const person = { age: 42};person[Symbol.unscopables] = { age: true};with (person) { console.log(age); // Expected output: Error: age is not defined}
Symbol.disposeSymbol.dispose
:“顯式資源管理”是指用戶通過(guò)使用命令式方法(如Symbol.dispose)或聲明式方法(如使用塊作用域聲明)顯式地管理“資源”的生命周期的系統(tǒng)。
{ console.log(1); using { [Symbol.dispose]() { console.log(2); } }; console.log(3); }// will log 1, 3, 2
總結(jié)這篇信息性的博客旨在深入介紹JavaScript語(yǔ)言中固有的著名symbol,例如Symbol.iterator
、Symbol.toStringTag
和Symbol.for
。這些symbol代表著復(fù)雜而多才多藝的工具,可以用來(lái)增強(qiáng)和調(diào)節(jié)代碼的行為。在JavaScript環(huán)境中全面理解可用symbol是開(kāi)發(fā)高性能、可維護(hù)和可擴(kuò)展應(yīng)用程序的關(guān)鍵。因此,在項(xiàng)目的概念化和實(shí)施階段,建議評(píng)估將這些symbol納入其中的可行性,以使代碼更加簡(jiǎn)潔、優(yōu)雅,達(dá)到預(yù)期的效果。
以上就是本文的全部?jī)?nèi)容,如果對(duì)你有所幫助,歡迎收藏、點(diǎn)贊、轉(zhuǎn)發(fā)~
關(guān)鍵詞:
- 個(gè)人護(hù)理小家電市場(chǎng)結(jié)構(gòu)迎變局 新興渠道規(guī)模不容小覷
- 廣州科技活動(dòng)周進(jìn)入預(yù)熱 明日正式啟動(dòng)300多場(chǎng)主題活動(dòng)接踵而來(lái)
- 深化重點(diǎn)領(lǐng)域信用建設(shè) 廣州正式出臺(tái)新型監(jiān)管機(jī)制實(shí)施方案
- 女童不慎掉入20米深井 18歲小姨三次下井成功營(yíng)救
- 西安3個(gè)區(qū)域12月28日起每日開(kāi)展全員核酸 官方提倡民眾居家健身
- 浙江樂(lè)清一核酸檢測(cè)結(jié)果異常人員 復(fù)采復(fù)檢為陰性
- 浙江本輪疫情報(bào)告確診病例490例 提倡“雙節(jié)”非必要不出省
- 西安警方通報(bào)6起涉疫違法案件
- 西安新一輪核酸篩查日檢測(cè)能力達(dá)160萬(wàn)管
- 西安市累計(jì)報(bào)告本土確診病例811例
-
江口:巧打“生態(tài)牌”念好“山字經(jīng)” 大力發(fā)展抹茶產(chǎn)業(yè) 熱點(diǎn)評(píng)
近年來(lái),我縣巧打“生態(tài)牌”,念好“山字經(jīng)”,大力發(fā)展抹茶產(chǎn)業(yè),著力把綠水青山變成金山銀山。獨(dú)特的地理環(huán)境和氣候,賦予了我
-
挪威軍工廠告狀!TikTok妨礙他們?cè)鞆椝幩蜑蹩颂m 天天微資訊
挪威軍工廠告狀!TikTok妨礙他們?cè)鞆椝幩蜑蹩颂m,挪威,彈藥,芬蘭,烏克蘭,俄羅斯,軍工廠,tiktok
-
新消息丨庫(kù)里:和維金斯聯(lián)系不多&要給他空間 雖然我們也想讓他回來(lái)
庫(kù)里:和維金斯聯(lián)系不多&要給他空間雖然我們也想讓他回來(lái),勇士,給他,維金斯,美國(guó)籃球,新奧爾良鵜鶘,nba常規(guī)賽,斯蒂芬·庫(kù)里,奧林匹克運(yùn)動(dòng)會(huì),布
-
雙壁波紋管公稱直徑和外徑對(duì)照表(雙壁波紋管外徑尺寸表) 天天熱頭條
1、HDPE雙壁波紋管外徑跟內(nèi)徑區(qū)別在于:雙壁波紋管外壁是波紋狀,內(nèi)壁圓弧面,要求規(guī)格用外壁的用外壁系列,要求內(nèi)經(jīng)的用內(nèi)經(jīng)系列。2、一般來(lái)
-
文學(xué)的發(fā)展_關(guān)于文學(xué)的發(fā)展簡(jiǎn)介
1、文學(xué)的發(fā)展是隨著社會(huì)的發(fā)展而發(fā)展的。2、作為一種社會(huì)意識(shí)形態(tài),文學(xué)的內(nèi)容、形式以及創(chuàng)作方法等,都要受到一定時(shí)代的
-
聚焦:廈門建發(fā)確定15億元公司債券利率為4.50%
3月29日,廈門建發(fā)集團(tuán)有限公司2023年面向?qū)I(yè)投資者公開(kāi)發(fā)行可續(xù)期公司債券(第一期)票面利率公告。據(jù)悉,本期債券計(jì)劃
-
環(huán)球快報(bào):特斯拉新款Model S/X開(kāi)啟中國(guó)市場(chǎng)交付
特斯拉新款ModelS X正式開(kāi)始在中國(guó)市場(chǎng)的交付。在上海特斯拉閔行交付中心,上海首批車主已經(jīng)提到新車。同時(shí),特斯拉全國(guó)各地特斯拉直營(yíng)門店也
-
環(huán)北部灣廣東水資源配置工程湛江分干線項(xiàng)目計(jì)劃4月全面動(dòng)工建設(shè)|今日?qǐng)?bào)
3月28日,記者從市水務(wù)局獲悉,備受關(guān)注的環(huán)北部灣廣東水資源配置工程湛江分干線項(xiàng)目加快推進(jìn),湛江分干線工程首個(gè)開(kāi)工點(diǎn)已于3月15日在麻章區(qū)
-
AI制藥概念股持續(xù)活躍 機(jī)構(gòu)稱短期需注意波動(dòng)風(fēng)險(xiǎn)
近期,AI制藥概念股表現(xiàn)活躍。其中,成都先導(dǎo)繼上一交易日20%幅度漲停后,昨日再大漲超14%,3月以來(lái)累計(jì)漲幅超過(guò)66%;和元生物昨日收漲5 8%,
-
薩曼莎·巴克斯_關(guān)于薩曼莎·巴克斯的簡(jiǎn)介
1、薩曼莎·巴克斯兼有歌手、演員身份,舞蹈也是她的長(zhǎng)項(xiàng),3歲起就學(xué)習(xí)過(guò)芭蕾舞、現(xiàn)代舞等。2007年她發(fā)行了自己的首張
X 關(guān)閉
你需要知道的Symbols|世界資訊
每日聚焦:“任意拘押帝國(guó)”嚴(yán)重踐踏人權(quán)(鐘聲)
柳宗元三戒原文和翻譯賞析_柳宗元三戒
王琇瑛_關(guān)于王琇瑛介紹 精彩看點(diǎn)
江西會(huì)昌:“四驅(qū)聯(lián)動(dòng)”筑牢消防安全“防火墻”
X 關(guān)閉
西安警方完成研考安保工作 共出動(dòng)警力逾1.3萬(wàn)人次
得知西安疫情防控“升級(jí)” 男子夜騎共享單車回咸陽(yáng)淳化
中國(guó)醫(yī)生將任SIU主席背后:從追隨者同行者到引領(lǐng)者
海南省通報(bào)政法隊(duì)伍教育整頓成果