摘要:實例中構(gòu)造函數(shù)的獲取每個實例中都包含一個的屬性,這個屬性指向的是實例的構(gòu)造函數(shù),在獲取到這個構(gòu)造函數(shù)后,就可以調(diào)用它的方法,然后就可以比較了。
焦慮和恐懼的區(qū)別是,恐懼是對世界上的存在的恐懼,而焦慮是在"我"面前的焦慮。——薩特《存在與虛無》
本文為讀 lodash 源碼的第十九篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-lodash
gitbook也會同步倉庫的更新,gitbook地址:pocket-lodash
前言在前文《lodash源碼分析之獲取數(shù)據(jù)類型》已經(jīng)解釋了獲取數(shù)據(jù)類型的方法,但是在有些環(huán)境下,一些 es6 新增的對象獲取到的類型都為 [object Object] ,這樣就沒辦法做細致的區(qū)分。例如在 IE11 中,通過 Object.prototype.toString 獲取到的 DataView 對象類型為 [object Object]。 因此在 getTag 中,lodash 針對這些對象做了一些兼容性的事情。
依賴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 的源碼很簡單,處理的是 DataView、Map、Set、Promise、WeakMap 等對象,下面就關(guān)鍵的幾點說明一下。
函數(shù)的toString方法const dataViewCtorString = `${DataView}` const mapCtorString = `${Map}` const promiseCtorString = `${Promise}` const setCtorString = `${Set}` const weakMapCtorString = `${WeakMap}`
我們都知道,DataView 這些其實都是構(gòu)造函數(shù),函數(shù)有 toString 的方法,調(diào)用后返回的是 function DataView() { [native code] } 這樣的格式,因為其實例調(diào)用 Object.prototype.toString 在某些環(huán)境下返回的是 [object Object],而構(gòu)造函數(shù)的 toString 返回的字符串中,包含了構(gòu)造函數(shù)名,可以通過這點來區(qū)分。
實例中構(gòu)造函數(shù)的獲取const Ctor = result == objectTag ? value.constructor : undefined const ctorString = Ctor ? `${Ctor}` : ""
每個實例中都包含一個 constructor 的屬性,這個屬性指向的是實例的構(gòu)造函數(shù),在獲取到這個構(gòu)造函數(shù)后,就可以調(diào)用它的 toString 方法,然后就可以比較了。
Promise.resolvegetTag(Promise.resolve()) != promiseTag
在條件判斷時,使用了 Promise.resolve() ,這樣使用的目的是獲取到 promise 對象,因為 Promise 是一個函數(shù)函數(shù),如果直接調(diào)用 Object.prototype.toString,返回的是 [object Function]。
License署名-非商業(yè)性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)
最后,所有文章都會同步發(fā)送到微信公眾號上,歡迎關(guān)注,歡迎提意見:
作者:對角另一面
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/97949.html
摘要:規(guī)范對類型的判斷進行了細化,前步可以看成跟的作用一樣,獲取到數(shù)據(jù)的類型,但是第步調(diào)用了的方法,如果再看規(guī)范的描述,可以知道這個其實是對象中的屬性,如果這個屬性返回的是一個字符串,則采用這個返回值作為數(shù)據(jù)的類型,否則才采用。 所有的悲傷,總會留下一絲歡樂的線索,所有的遺憾,總會留下一處完美的角落,我在冰峰的深海,尋找希望的缺口,卻在驚醒時,瞥見絕美的陽光!——幾米 本文為讀 lodas...
摘要:卡爾維諾煙云本文為讀源碼的第二十一篇,后續(xù)文章會更新到這個倉庫中,歡迎也會同步倉庫的更新,地址依賴源碼分析之數(shù)據(jù)類型獲取的兼容性源碼分析之源碼分析用來判斷某個值是否為類對象。如果某個值為類對象使用判斷,并且調(diào)用返回的值為時,則為類對象。 有人命中注定要過平庸的生活,默默無聞,因為他們經(jīng)歷了痛苦或不幸;有人卻故意這樣做,那是因為他們得到的幸福超過了他們的承受能力?!柧S諾《煙云》 ...
摘要:接口設計同樣實現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數(shù)用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應緩存方式的實例這個函數(shù)根據(jù)來獲取儲存了該的緩存實例。 每個人心里都有一團火,路過的人只看到煙?!吨翋坭蟾摺ば强罩i》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-...
摘要:接口設計同樣實現(xiàn)了跟一致的數(shù)據(jù)管理接口,如下依賴源碼分析之緩存源碼分析之緩存源碼分析是否使用這個函數(shù)用來判斷是否使用緩存。返回表示使用緩存,返回則使用或者緩存。獲取對應緩存方式的實例這個函數(shù)根據(jù)來獲取儲存了該的緩存實例。 每個人心里都有一團火,路過的人只看到煙。——《至愛梵高·星空之謎》 本文為讀 lodash 源碼的第八篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-...
摘要:在之前的文章中已經(jīng)介紹過,檢測的是對應的數(shù)組在二維數(shù)組中的索引,其行為跟一致,不存在于二維數(shù)組中時,返回,否則返回索引值。最后將緩存數(shù)量減少。 昨日我沿著河岸/漫步到/蘆葦彎腰喝水的地方順便請煙囪/在天空為我寫一封長長的信 潦是潦草了些/而我的心意/則明亮亦如你窗前的燭光/稍有曖昧之處/勢所難免/因為風的緣故 ——洛夫《因為風的緣故》 本文為讀 lodash 源碼的第七篇,后續(xù)文章會...
閱讀 3495·2023-04-25 18:14
閱讀 1602·2021-11-24 09:38
閱讀 3317·2021-09-22 14:59
閱讀 3123·2021-08-09 13:43
閱讀 2643·2019-08-30 15:54
閱讀 619·2019-08-30 13:06
閱讀 1625·2019-08-30 12:52
閱讀 2776·2019-08-30 11:13