焦虑和恐惧的区别在于,恐惧是对存在于这个世界的恐惧,而焦虑是“我”面前的焦虑。——萨特《存在与虚无》本文是阅读lodash源码的第十九篇,后续文章会更新到本仓库,欢迎star:pocket-lodashgitbook也会同步更新仓库,gitbook地址:pocket-lodash前言在前面的文章《lodash源码分析之获取数据类型》中已经说明了获取数据类型的方法,但是在某些环境下,es6中一些新对象的获取类型是[objectObject],所以没办法做一个详细区分。例如在IE11中,通过Object.prototype.toString得到的DataView对象类型为[objectObject]。所以在getTag中,lodash对这些对象做了一些兼容的事情。依赖importbaseGetTagfrom'./baseGetTag.js'《lodash源码分析之获取数据类型》源码分析constdataViewTag='[objectDataView]'constmapTag='[objectMap]'constobjectTag='[objectObject]'constpromiseTag='[objectPromise]'constsetTag='[objectSet]'constweakMapTag='[objectWeakMap]'/**用于检测maps、sets和weakmaps。*/constdataViewCtorString=`${DataView}`constmapCtorString=`${Map}`constpromiseCtorString=`${Promise}`constsetCtorString=`${Set}`constweakMapCtorString=`${WeakMap}`letgetTag=baseGetTag//IE11中数据视图、映射、集合和弱映射的回退以及Node.js中的承诺<6.if((DataView&&getTag(newDataView(newArrayBuffer(1)))!=dataViewTag)||(getTag(newMap)!=mapTag)||(getTag(Promise.resolve())!=promiseTag)||(getTag(newSet)!=setTag)||(getTag(newWeakMap)!=weakMapTag)){getTag=(value)=>{constresult=baseGetTag(value)constCtor=result==objectTag?value.constructor:联合国定义constctorString=Ctor?`${Ctor}`:''if(ctorString){switch(ctorString){casedataViewCtorString:returndataViewTagcasemapCtorString:returnmapTagcasepromiseCtorString:returnpromiseTagcasesetCtorString:returnsetTagcaseweakMapCtorString:return}}返回结果}}的getTag的源代码非常简单。它处理DataView、Map、Set、Promise和WeakMap等对象。下面重点讲解函数的toString方法。constdataViewCtorString=`${DataView}`constmapCtorString=`${Map}`constpromiseCtorString=`${Promise}`constsetCtorString=`${Set}`constweakMapCtorString=`${WeakMap}`我们都知道DataView其实是一个构造函数,函数有toString方法,调用后返回的格式是functionDataView(){[nativecode]},因为它的实例在某些环境下调用Object.prototype.toString返回[objectObject],而构造函数的toString返回字符串中包含构造函数名称,可以通过这个来区分。获取实例中的构造函数constCtor=result==objectTag?value.constructor:undefinedconstctorString=Ctor?`${Ctor}`:''每个实例都包含一个constructor属性,指向实例的构造函数,拿到这个构造函数后,就可以调用它的toString方法,然后就可以进行比较了。Promise.resolvegetTag(Promise.resolve())!=promiseTag在判断条件时使用Promise.resolve()。这个使用的目的是获取promise对象,因为Promise是一个function函数,如果直接调用Object.prototype。toString,返回[objectFunction]。许可签名-非商业使用-不得推导4.0国际(CCBY-NC-ND4.0)最后,所有文章会同步发送到微信公众号,欢迎关注,欢迎评论:作者:彼岸对角线
