成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

lodash源碼分析之?dāng)?shù)據(jù)類型獲取的兼容性

avwu / 1580人閱讀

摘要:實(shí)例中構(gòu)造函數(shù)的獲取每個(gè)實(shí)例中都包含一個(gè)的屬性,這個(gè)屬性指向的是實(shí)例的構(gòu)造函數(shù),在獲取到這個(gè)構(gòu)造函數(shù)后,就可以調(diào)用它的方法,然后就可以比較了。

焦慮和恐懼的區(qū)別是,恐懼是對(duì)世界上的存在的恐懼,而焦慮是在"我"面前的焦慮。

——薩特《存在與虛無(wú)》

本文為讀 lodash 源碼的第十九篇,后續(xù)文章會(huì)更新到這個(gè)倉(cāng)庫(kù)中,歡迎 star:pocket-lodash

gitbook也會(huì)同步倉(cāng)庫(kù)的更新,gitbook地址:pocket-lodash

前言

在前文《lodash源碼分析之獲取數(shù)據(jù)類型》已經(jīng)解釋了獲取數(shù)據(jù)類型的方法,但是在有些環(huán)境下,一些 es6 新增的對(duì)象獲取到的類型都為 [object Object] ,這樣就沒(méi)辦法做細(xì)致的區(qū)分。例如在 IE11 中,通過(guò) Object.prototype.toString 獲取到的 DataView 對(duì)象類型為 [object Object]。 因此在 getTag 中,lodash 針對(duì)這些對(duì)象做了一些兼容性的事情。

依賴
import baseGetTag from "./baseGetTag.js"

《lodash源碼分析之獲取數(shù)據(jù)類型》

源碼分析
const dataViewTag = "[object DataView]"
const mapTag = "[object Map]"
const objectTag = "[object Object]"
const promiseTag = "[object Promise]"
const setTag = "[object Set]"
const weakMapTag = "[object WeakMap]"

/** Used to detect maps, sets, and weakmaps. */
const dataViewCtorString = `${DataView}`
const mapCtorString = `${Map}`
const promiseCtorString = `${Promise}`
const setCtorString = `${Set}`
const weakMapCtorString = `${WeakMap}`

let getTag = baseGetTag

// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
    (getTag(new Map) != mapTag) ||
    (getTag(Promise.resolve()) != promiseTag) ||
    (getTag(new Set) != setTag) ||
    (getTag(new WeakMap) != weakMapTag)) {
  getTag = (value) => {
    const result = baseGetTag(value)
    const Ctor = result == objectTag ? value.constructor : undefined
    const ctorString = Ctor ? `${Ctor}` : ""

    if (ctorString) {
      switch (ctorString) {
        case dataViewCtorString: return dataViewTag
        case mapCtorString: return mapTag
        case promiseCtorString: return promiseTag
        case setCtorString: return setTag
        case weakMapCtorString: return weakMapTag
      }
    }
    return result
  }
}

getTag 的源碼很簡(jiǎn)單,處理的是 DataView、Map、SetPromise、WeakMap 等對(duì)象,下面就關(guān)鍵的幾點(diǎn)說(shuō)明一下。

函數(shù)的toString方法
const dataViewCtorString = `${DataView}`
const mapCtorString = `${Map}`
const promiseCtorString = `${Promise}`
const setCtorString = `${Set}`
const weakMapCtorString = `${WeakMap}`

我們都知道,DataView 這些其實(shí)都是構(gòu)造函數(shù),函數(shù)有 toString 的方法,調(diào)用后返回的是 function DataView() { [native code] } 這樣的格式,因?yàn)槠鋵?shí)例調(diào)用 Object.prototype.toString 在某些環(huán)境下返回的是 [object Object],而構(gòu)造函數(shù)的 toString 返回的字符串中,包含了構(gòu)造函數(shù)名,可以通過(guò)這點(diǎn)來(lái)區(qū)分。

實(shí)例中構(gòu)造函數(shù)的獲取
 const Ctor = result == objectTag ? value.constructor : undefined
 const ctorString = Ctor ? `${Ctor}` : ""

每個(gè)實(shí)例中都包含一個(gè) constructor 的屬性,這個(gè)屬性指向的是實(shí)例的構(gòu)造函數(shù),在獲取到這個(gè)構(gòu)造函數(shù)后,就可以調(diào)用它的 toString 方法,然后就可以比較了。

Promise.resolve
getTag(Promise.resolve()) != promiseTag

在條件判斷時(shí),使用了 Promise.resolve() ,這樣使用的目的是獲取到 promise 對(duì)象,因?yàn)?Promise 是一個(gè)函數(shù)函數(shù),如果直接調(diào)用 Object.prototype.toString,返回的是 [object Function]。

License

署名-非商業(yè)性使用-禁止演繹 4.0 國(guó)際 (CC BY-NC-ND 4.0)

最后,所有文章都會(huì)同步發(fā)送到微信公眾號(hào)上,歡迎關(guān)注,歡迎提意見(jiàn):

作者:對(duì)角另一面

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97949.html

相關(guān)文章

  • lodash源碼分析獲取數(shù)據(jù)類型

    摘要:規(guī)范對(duì)類型的判斷進(jìn)行了細(xì)化,前步可以看成跟的作用一樣,獲取到數(shù)據(jù)的類型,但是第步調(diào)用了的方法,如果再看規(guī)范的描述,可以知道這個(gè)其實(shí)是對(duì)象中的屬性,如果這個(gè)屬性返回的是一個(gè)字符串,則采用這個(gè)返回值作為數(shù)據(jù)的類型,否則才采用。 所有的悲傷,總會(huì)留下一絲歡樂(lè)的線索,所有的遺憾,總會(huì)留下一處完美的角落,我在冰峰的深海,尋找希望的缺口,卻在驚醒時(shí),瞥見(jiàn)絕美的陽(yáng)光!——幾米 本文為讀 lodas...

    huangjinnan 評(píng)論0 收藏0
  • lodash源碼分析isArguments

    摘要:卡爾維諾煙云本文為讀源碼的第二十一篇,后續(xù)文章會(huì)更新到這個(gè)倉(cāng)庫(kù)中,歡迎也會(huì)同步倉(cāng)庫(kù)的更新,地址依賴源碼分析之?dāng)?shù)據(jù)類型獲取的兼容性源碼分析之源碼分析用來(lái)判斷某個(gè)值是否為類對(duì)象。如果某個(gè)值為類對(duì)象使用判斷,并且調(diào)用返回的值為時(shí),則為類對(duì)象。 有人命中注定要過(guò)平庸的生活,默默無(wú)聞,因?yàn)樗麄兘?jīng)歷了痛苦或不幸;有人卻故意這樣做,那是因?yàn)樗麄兊玫降男腋3^(guò)了他們的承受能力?!柧S諾《煙云》 ...

    _Dreams 評(píng)論0 收藏0
  • lodash源碼分析緩存方式選擇

    摘要:接口設(shè)計(jì)同樣實(shí)現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個(gè)函數(shù)用來(lái)判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對(duì)應(yīng)緩存方式的實(shí)例這個(gè)函數(shù)根據(jù)來(lái)獲取儲(chǔ)存了該的緩存實(shí)例。 每個(gè)人心里都有一團(tuán)火,路過(guò)的人只看到煙?!吨翋?ài)梵高·星空之謎》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會(huì)更新到這個(gè)倉(cāng)庫(kù)中,歡迎 star:pocket-...

    HitenDev 評(píng)論0 收藏0
  • lodash源碼分析緩存方式選擇

    摘要:接口設(shè)計(jì)同樣實(shí)現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個(gè)函數(shù)用來(lái)判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對(duì)應(yīng)緩存方式的實(shí)例這個(gè)函數(shù)根據(jù)來(lái)獲取儲(chǔ)存了該的緩存實(shí)例。 每個(gè)人心里都有一團(tuán)火,路過(guò)的人只看到煙?!吨翋?ài)梵高·星空之謎》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會(huì)更新到這個(gè)倉(cāng)庫(kù)中,歡迎 star:pocket-...

    AdolphLWQ 評(píng)論0 收藏0
  • lodash源碼分析List緩存

    摘要:在之前的文章中已經(jīng)介紹過(guò),檢測(cè)的是對(duì)應(yīng)的數(shù)組在二維數(shù)組中的索引,其行為跟一致,不存在于二維數(shù)組中時(shí),返回,否則返回索引值。最后將緩存數(shù)量減少。 昨日我沿著河岸/漫步到/蘆葦彎腰喝水的地方順便請(qǐng)煙囪/在天空為我寫一封長(zhǎng)長(zhǎng)的信 潦是潦草了些/而我的心意/則明亮亦如你窗前的燭光/稍有曖昧之處/勢(shì)所難免/因?yàn)轱L(fēng)的緣故 ——洛夫《因?yàn)轱L(fēng)的緣故》 本文為讀 lodash 源碼的第七篇,后續(xù)文章會(huì)...

    leon 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<