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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Symbol的基本使用

發(fā)布時(shí)間:2023/12/16 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Symbol的基本使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Symbol的介紹

????????ES6引入了一種新的原始數(shù)據(jù)類型Symbol,表示獨(dú)一無(wú)二的值。它是Javascript語(yǔ)言的第七種數(shù)據(jù)類型。

????????ES5對(duì)象屬性名都是字符串,這容易造成屬性名的沖突。為了解決這個(gè)問(wèn)題引入了Symbol類型來(lái)解決命名沖突的問(wèn)題。

????????Symbol值通過(guò)Symbol函數(shù)生成,也就是說(shuō),對(duì)象的屬性名現(xiàn)在可以有兩種形類型,一種是原來(lái)就有的字符串,另一種就是新增的Symbol類型。

Symbol的特點(diǎn)

  • Symbol的值是唯一的,用來(lái)解決命名沖突的問(wèn)題
  • Symbol值不能與其他數(shù)據(jù)進(jìn)行運(yùn)算
  • Symbol定義的對(duì)象屬性不能使用for.in循環(huán)遍歷,但是可以使用Reflect.ownkeys來(lái)獲取對(duì)象的所有鍵名?
  • 認(rèn)識(shí)Symbol

    ?Symobol函數(shù)可以接受一個(gè)字符串作為參數(shù),用來(lái)區(qū)分或者描述Symbol實(shí)例。

    // 創(chuàng)建Symbol let x = Symbol('abc') let y = Symbol('123') console.log(x, y); // Symbol(abc) Symbol(123)

    如果Symbol的參數(shù)傳遞的是一個(gè)對(duì)象,那么它內(nèi)部會(huì)調(diào)用toString方法將對(duì)象轉(zhuǎn)為字符串,在生成一個(gè)Symbol值。

    // 參數(shù)傳遞對(duì)象 let a = Symbol({a: "a"}) console.log(a); // Symbol([object Object])

    相同參數(shù)創(chuàng)建出來(lái)的Symbol值是不相等的

    // 相同參數(shù)不相等 let b = Symbol("1"); let c = Symbol("1"); console.log(b === c) // false let d = Symbol(); let e = Symbol(); console.log(d === e) // false

    Symbol的值不能與其他類型的值進(jìn)行運(yùn)算,如果進(jìn)行運(yùn)算會(huì)報(bào)錯(cuò)。

    // 不能與其他類型的值進(jìn)行運(yùn)算 let n = Symbol("hello") console.log(n + "world"); // Uncaught TypeError: Cannot convert a Symbol value to a string

    Symbol可以顯示轉(zhuǎn)為字符串。

    // Symbol顯示轉(zhuǎn)為字符串 let f = Symbol("hello wrold") console.log(f.toString()); // Symbol(hello wrold) console.log(typeof f.toString()); // string

    Symbol也可以轉(zhuǎn)為Boolean值

    // Symbol也可以轉(zhuǎn)為Boolean值 let g = Symbol("hello wrold") console.log(Boolean(g)); // true

    Symbol作為對(duì)象的屬性名

    ????????前面我們說(shuō)到每一個(gè)Symbol的值都是不相等的,所以我們可以將Symbol的值作為對(duì)象的屬性名來(lái)使用,這樣就能保證不會(huì)出現(xiàn)同名屬性,防止屬性被覆蓋或者改寫(xiě)。

    // 將Symbol作為對(duì)象的屬性名使用 let sym = Symbol('sym'),sym1 = Symbol('sym1'),sym2 = Symbol('sym2'); const obj = {[sym]: "hello", } obj[sym1] = "world" Object.defineProperty(obj, sym2, {value: "!!!!"}) console.log(obj); // {Symbol(sym): 'hello', Symbol(sym1): 'world', Symbol(sym2): '!!!!'} console.log(obj[sym], obj[sym1] ,obj[sym2]); // hello world !!!! const fun = Symbol('fun'); const obj1 = {[fun] () {console.log('hello world!');} } obj1[fun]() //hello world!

    Symbol屬性名的遍歷

    ????????Symbol 作為屬性名,該屬性不會(huì)出現(xiàn)在for in、for of循環(huán)中,也不會(huì)被Object.keys()、Object.getOwnPropertyNames()返回。但是它也不是私有屬性,有一個(gè)Object.getOwnPropertySymbols()方法可以獲指定對(duì)象的所有Symbol屬性名。

    ????????Object.getOwnPropertySymbols()方法返回的是一個(gè)數(shù)組,成員是當(dāng)前對(duì)象所有用作屬性名的Symbol值

    ????????Reflect.ownKeys()方法返回所有類型的鍵名,包括常規(guī)鍵名和Symbol鍵名。

    const a = Symbol('a') const b = Symbol('b') const obj = {a: 'a',b: 'b',[a]: 'a',[b]: 'b' } // // 返回當(dāng)前對(duì)象所有用作屬性名的Symbol值 const objSymbols = Object.getOwnPropertySymbols(obj) console.log(objSymbols); // [Symbol(a), Symbol(b)] // 返回對(duì)象內(nèi)所有類型的鍵名 const objSymbols1 = Reflect.ownKeys(obj) console.log(objSymbols1); // ['a', 'b', Symbol(a), Symbol(b)]

    Symbol.for() 、Symbol.keyFor()

    ????????有時(shí)候我們想要使用同一個(gè)Symbol值,Symbol.keyFor()方法可以做到這一點(diǎn)。它接收一個(gè)字符串參數(shù),讓后搜索有沒(méi)有以該參數(shù)作為名稱的Symbol值,如果有,就返回這個(gè)Symbol值,否則就新建一個(gè)以該字符串命名的Symbol值。

    // 同樣參數(shù)使用Symbol.for方法生成的值相同 let sym = Symbol.for('a'); let sym1 = Symbol.for('a'); console.log(sym === sym1); // true

    ????????Symbol.for()和Symbol()這兩種寫(xiě)法都會(huì)生成新的Symbol,它們的區(qū)別是,前者會(huì)被登記在全局環(huán)境中供搜索,而后者不會(huì)Symbol.for(),不會(huì)在每次調(diào)用時(shí)都返回一個(gè)新的Symbol類型的值,而是先檢查給定的key是否已經(jīng)存在,如果不存在就會(huì)返回一個(gè)新值。

    Symbol.keyFor()方法返回一個(gè)已登記的Symbol類型值的key

    let sym = Symbol.for('a'); let sym1 = Symbol('a'); console.log(Symbol.keyFor(sym)); // 'a' console.log(Symbol.keyFor(sym1)); // undefined

    sym1屬于為登記的Symbol值,所以返回undefined

    注意:Symbol.for()方法為Symbol方法登記的名字是全局的。

    內(nèi)置的Symbol

    ????????除了定義自己使用的 Symbol 值以外,ES6 還提供了 11 個(gè)內(nèi)置的 Symbol 值,指向語(yǔ)言內(nèi)部使用的方法。

    ? ? ? ? 以下屬性不一一舉例說(shuō)明了,如果需要詳細(xì)示例請(qǐng)看ECMAScript 6 標(biāo)準(zhǔn)入門https://es6.ruanyifeng.com/#docs/symbol

    Symbol.hasInstance

    ????????對(duì)象的Symbol.hasInstance屬性,指向一個(gè)內(nèi)部方法。當(dāng)其他對(duì)象使用instanceof運(yùn)算符,判斷是否為該對(duì)象的實(shí)例時(shí),會(huì)調(diào)用這個(gè)方法。比如,foo instanceof Foo在語(yǔ)言內(nèi)部,實(shí)際調(diào)用的是Foo[Symbol.hasInstance](foo)。

    class MyClass {[Symbol.hasInstance](foo) {return foo instanceof Array;} } [1, 2, 3] instanceof new MyClass() // true

    ????????上面代碼中,MyClass是一個(gè)類,new MyClass()會(huì)返回一個(gè)實(shí)例。該實(shí)例的Symbol.hasInstance方法,會(huì)在進(jìn)行instanceof運(yùn)算時(shí)自動(dòng)調(diào)用,判斷左側(cè)的運(yùn)算子是否為Array的實(shí)例。

    Symbol.isConcatSpreadable

    ????????對(duì)象的Symbol.isConcatSpreadable屬性等于一個(gè)布爾值,表示該對(duì)象用于Array.prototype.concat()時(shí),是否可以展開(kāi)。

    Symbol.species

    對(duì)象的Symbol.species屬性,指向一個(gè)構(gòu)造函數(shù)。創(chuàng)建造衍生對(duì)象時(shí),會(huì)使用該屬性。

    ?

    Symbol.match

    對(duì)象的Symbol.match屬性,指向一個(gè)函數(shù)。當(dāng)執(zhí)行str.match(myObject)時(shí),如果該屬性存在,會(huì)調(diào)用它,返回該方法的返回值。

    Symbol.replace

    對(duì)象的Symbol.replace屬性,指向一個(gè)方法,當(dāng)該對(duì)象被String.prototype.replace方法調(diào)用時(shí),會(huì)返回該方法的返回值。

    Symbol.search

    對(duì)象的Symbol.search屬性,指向一個(gè)方法,當(dāng)該對(duì)象被String.prototype.search方法調(diào)用時(shí),會(huì)返回該方法的返回值。

    Symbol.split

    對(duì)象的Symbol.split屬性,指向一個(gè)方法,當(dāng)該對(duì)象被String.prototype.split方法調(diào)用時(shí),會(huì)返回該方法的返回值。

    Symbol.iterator

    對(duì)象的Symbol.iterator屬性,指向該對(duì)象的默認(rèn)遍歷器方法。

    Symbol.toPrimitive

    對(duì)象的Symbol.toPrimitive屬性,指向一個(gè)方法。該對(duì)象被轉(zhuǎn)為原始類型的值時(shí),會(huì)調(diào)用這個(gè)方法,返回該對(duì)象對(duì)應(yīng)的原始類型值。

    Symbol.toPrimitive被調(diào)用時(shí),會(huì)接受一個(gè)字符串參數(shù),表示當(dāng)前運(yùn)算的模式,一共有三種模式。

    • Number:該場(chǎng)合需要轉(zhuǎn)成數(shù)值
    • String:該場(chǎng)合需要轉(zhuǎn)成字符串
    • Default:該場(chǎng)合可以轉(zhuǎn)成數(shù)值,也可以轉(zhuǎn)成字符串

    Symbol.toStringTag

    對(duì)象的Symbol.toStringTag屬性,指向一個(gè)方法。在該對(duì)象上面調(diào)用Object.prototype.toString方法時(shí),如果這個(gè)屬性存在,它的返回值會(huì)出現(xiàn)在toString方法返回的字符串之中,表示對(duì)象的類型。也就是說(shuō),這個(gè)屬性可以用來(lái)定制[object Object]或[object Array]中object后面的那個(gè)字符串。

    Symbol.unscopables

    對(duì)象的Symbol.unscopables屬性,指向一個(gè)對(duì)象。該對(duì)象指定了使用with關(guān)鍵字時(shí),哪些屬性會(huì)被with環(huán)境排除。

    總結(jié)

    以上是生活随笔為你收集整理的Symbol的基本使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。