• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    ES6中Symbol相關知識的介紹(代碼示例)

    來源:懂視網 責編:小采 時間:2020-11-27 19:28:40
    文檔

    ES6中Symbol相關知識的介紹(代碼示例)

    ES6中Symbol相關知識的介紹(代碼示例):本篇文章給大家帶來的內容是關于ES6中Symbol相關知識的介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。symbol是es6出的一種類型,他也是屬于原始類型的范疇(string, number, boolean, null, undefine
    推薦度:
    導讀ES6中Symbol相關知識的介紹(代碼示例):本篇文章給大家帶來的內容是關于ES6中Symbol相關知識的介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。symbol是es6出的一種類型,他也是屬于原始類型的范疇(string, number, boolean, null, undefine

    本篇文章給大家帶來的內容是關于ES6中Symbol相關知識的介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

    symbol是es6出的一種類型,他也是屬于原始類型的范疇(string, number, boolean, null, undefined, symbol)

    basic

    let name = Symbol('xiaohesong')
    typeof name // 'symbol'
    let obj = {}
    obj[name] = 'xhs'
    console.log(obj[name]) //xhs

    symbol for

    這個東西是可共享,在創建的時候會檢查全局是否尋在這個key的symbol.如果存在就直接返回這個symbol,如果不存在就會創建,并且在全局注冊。

    let uid = Symbol.for("uid");
    let object = {
     [uid]: "12345"
    };
    
    console.log(object[uid]); // "12345"
    console.log(uid); // "Symbol(uid)"
    
    let uid2 = Symbol.for("uid");
    
    console.log(uid === uid2); // true
    console.log(object[uid2]); // "12345"
    console.log(uid2); // "Symbol(uid)"
    此處所說的共享是全局性的共享,類似于global scope,是整個大環境下的共享.

    symbol keyfor

    let uid = Symbol.for("uid");
    console.log(Symbol.keyFor(uid)); // "uid"
    
    let uid2 = Symbol.for("uid");
    console.log(Symbol.keyFor(uid2)); // "uid"
    
    let uid3 = Symbol("uid");
    console.log(Symbol.keyFor(uid3)); // undefined

    全局注冊表不存在uid3這個共享的symbol.所以取不出對應的key.由此可見,這個是獲取對應的key.

    symbol 不可強制轉換

    let uid = Symbol('uid')
    uid + ''

    這里會報錯,根據規范,他會把uid轉換成字符串進行相加。如果真的相加,可以先String(uid)之后再相加,不過目前看來,似乎沒什么意義。

    obj中symbol key的獲取

    let uid = Symbol('uid')
    let obj = {
     [uid]: 'uid'
    }
    
    console.log(Object.keys(obj)) // []
    console.log(Object.getOwnPropertyNames(obj)) // []
    console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(uid)]

    es6針對這個,添加了Object.getOwnPropertySymbols方法。

    是不是感覺很少用到Symbols.其實es6內部用的還是不少的。

    Symbol.hasInstance

    每個函數都有這個方法?;蛟S你對這個方法不是很熟,他其實就是instanceof所做的事情。 沒錯,es6給你重寫了這個方法。

    function Xiao(){}
    const xiao = new Xiao
    xiao instanceof Xiao // true

    實際上es6幫你那么干了

    Xiao[Symbol.hasInstance](xiao)

    這個是內部的方法,不支持重寫,當然,我們可以在原型上改寫。

    Object.definePrototype(Xiao, Symbol.hasInstance, {
     value: (v) : Boolean(v)
    })
    const x = new Xiao
    x instanceof Xiao //true
    0 instanceof Xiao //false
    1 instanceof Xiao //true

    可以發現,我們改寫他返回對應的是否為boolean類型。

    Symbol.isConcatSpreadable

    這個和其他的一些屬性不同,他是默認不存在一些標準對象上。簡單的使用

    let objs = {0: 'first', 1: 'second', length: 2, [Symbol.isConcatSpreadable]: true}
    ['arrs'].concat(objs) //["arrs", "first", "second"]

    Symbol.toPrimitive

    這個用的就多了,進行類型轉換的時候,對象會進行嘗試轉換成原始類型,就是通過toPrimitive.這個方法,標準類型的原型上都存在。
    進行類型轉換的時候,toPrimitive會被強制的調用一個參數,在規范中這個參數被稱之為hint. 這個參數是三個值('number', 'string', 'default')其中的一個。
    顧名思義,string返回的是string, number返回的是number,default是沒有特別指定,默認。
    那么什么是默認的情況呢? 大多數的情況下,默認情況就是數字模式。(日期除外,他的默認情況視為字符串模式)
    其實在類型轉換時調用默認情況的也不是很多。如(==, +)或者將參數傳遞給Date的構造參數的時候。

  • number mode 在數字情況下的行為(優先級從高到低)

  • 首先調用valueOf,如果是一個原始類型,那就返回。

  • 如果前面不是原始值,那么就嘗試調用toString,如果是原始值,那么就返回

  • 如果都不存在,那么就報錯

  • string mode 在字符串的情況下,行為略有不同(優先級從高到低)

  • 首先調用toString,如果是原始值,那么就返回

  • 如果前面不是原始值,那么就嘗試調用valueOf,如果是原始值,那么就返回

  • 拋出錯誤

  • 嗯,是不是感覺挺繞的,是啊,代碼闡述下嘛。

    let obj = {
     valueOf: function(){console.log('valueOf')},
     toString: function(){console.log('toString')}
    }
    // console.log value is
    obj + 2 //valueOf
    obj == 2 // valueOf
    Number(obj) // valueOf
    String(obj) // toString

    通過上面的輸出,可以發現大多數的情況都是首先調用valueOf.
    包括默認的情況,他的默認是調用的數字模式,而且絕大數都是調用的數字模式,可以發現toString是調用了string的模式。所以你可以認為,基本就是數字模式,除非很顯示的是字符串模式。
    對于這個調用的模式還不是很清楚?沒事,es6把這個內部的方法對外暴露出來了,我們可以改寫他,輸出這個hint的類型。 來

    function Temperature(degrees) {
     this.degrees = degrees;
    }
    
    Temperature.prototype[Symbol.toPrimitive] = function(hint) {
     console.log('hint is', hint)
    };
    
    let freezing = new Temperature(32);
    
    freezing + 2 // ..
    freezing / 2 // ..
    ...

    上面的類型,你可以試試。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    ES6中Symbol相關知識的介紹(代碼示例)

    ES6中Symbol相關知識的介紹(代碼示例):本篇文章給大家帶來的內容是關于ES6中Symbol相關知識的介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。symbol是es6出的一種類型,他也是屬于原始類型的范疇(string, number, boolean, null, undefine
    推薦度:
    標簽: 介紹 知識 簡介
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 精品一区二区三区四区在线| 日韩精品无码专区免费播放| 老司机亚洲精品影院| 2022国产精品最新在线| 久久久久女人精品毛片| 久久久久99精品成人片三人毛片| 色偷偷888欧美精品久久久| 人妻少妇精品视频二区 | 四虎国产精品免费久久5151| 精品人妻中文字幕有码在线 | 国产精品高清一区二区三区不卡 | 亚洲精品无码精品mV在线观看| 黑巨人与欧美精品一区| 国产69精品久久久久99| 国产精品美女久久久久网| 国语精品一区二区三区| 日韩精品人妻系列无码专区免费| 午夜在线视频91精品 | 精品不卡一区二区| 日本精品自产拍在线观看中文 | 国产91精品一区二区麻豆网站 | 国内精品久久久久影院优| 日韩精品无码中文字幕一区二区| 欧美日韩国产中文精品字幕自在自线 | 亚洲性日韩精品国产一区二区 | 国产亚洲精品资在线| 91精品国产品国语在线不卡| 久久99国产精品久久| 国内精品免费在线观看| 欧美国产日韩精品| 51久久夜色精品国产| 99九九精品免费视频观看| 国产成人精品高清不卡在线 | 国内精品久久久久久久久| 国产精品日韩欧美久久综合 | 国产一区精品| 国内精品久久久久久久涩爱| 精品一区二区三区色花堂| 久久免费国产精品| 色偷偷88欧美精品久久久| 综合人妻久久一区二区精品|