亚洲ww无码ww专区1234_亚洲AV综合色区无码三区30p_丰满二级精品一区_美女黄频视频大全免费的正片_久久综合九色综合网站

你需要知道的Symbols|世界資訊

2023-03-30 07:27:27    來(lái)源:博客園
著名symbol

著名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.iterator

Symbol.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.toStringTag

Symbol.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.toPrimitive

Symbol.toPrimitive:該symbol被用來(lái)指定對(duì)象在隱式調(diào)用valueOftoString方法時(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.asyncIterator

Symbol.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.hasInstance

Symbol.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.isConcatSpreadable

Symbol.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.species

Symbol.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

P.S:這一功能在未來(lái)可能會(huì)被刪除。

Symbol.match

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.replace

Symbol.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.split

Symbol.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.unscopables

Symbol.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.dispose

Symbol.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.toStringTagSymbol.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)鍵詞:

X 關(guān)閉

財(cái)經(jīng) 查看更多
安陽(yáng)曹操墓將于2022年5月正式對(duì)公眾開(kāi)放
時(shí)間·2021-12-29    來(lái)源·中新網(wǎng)
為什么這次寒潮南方降雪這么明顯?
時(shí)間·2021-12-29    來(lái)源·新華社
山西絳縣6名失蹤者全部遇難 當(dāng)?shù)兀阂蚜刚{(diào)查
時(shí)間·2021-12-29    來(lái)源·中新網(wǎng)

X 關(guān)閉