博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue源码中为什么要const _toStr = Object.prototype.toString?
阅读量:5960 次
发布时间:2019-06-19

本文共 1251 字,大约阅读时间需要 4 分钟。

在vue的源码中,文件中存放的是一些方法。其中作者用了Object.prototype.toString这个方法来判断类型,但是并没有直接用,而是单独保存在一个变量:

const _toStr = Object.prototype.toString复制代码

那么为什么要这么做呢?

先说下判断类型。众所周知,typeof在判断对象时不能正确判断Null,并且不能识别出Array,但在判断基础类型时是没问题的。所以尤大也写了:

export function isPrimitive (value: any): boolean %checks {  return (    typeof value === 'string' ||    typeof value === 'number' ||    // $flow-disable-line    typeof value === 'symbol' ||    typeof value === 'boolean'  )}复制代码

判断Object也做了区分,isObject和isPlainObject :

export function isObject (obj: mixed): boolean %checks {  return obj !== null && typeof obj === 'object'}export function isPlainObject (obj: any): boolean {  return _toString.call(obj) === '[object Object]'}复制代码

到了判断复杂类型的时候,一般我们用Object.prototype.toString或者是instanceof。如果是前者的话会返回类似'[object Object]'的字符串。后者则会判断一个对象的原型链上是否存在一个构造函数。

两者还有一些不同。Object.prototype.toString.call(1) 和 Object.prototype.toString.call(Number(1))时,返回的都是"[object Number]",也就是说,它并不能区分原始类型和复杂类型。可见,Object.prototype.toString.call并不像很多教程说的那样好用。

Object.prototype.toString.call(1)"[object Number]"Object.prototype.toString.call(new Number(1))"[object Number]"复制代码

如果要使用,就需要像尤大一样,把原始类型单独拎出来判断,再去判断复杂类型,而走到这一步的时候尤大就写了上面说那行const _toStr。这是因为,toString实在是太容易被重写了。如果toString被其他人重写,将会对代码中涉及到的部分造成影响,所以就保存下来防止这种情况发生。

转载地址:http://pruax.baihongyu.com/

你可能感兴趣的文章
MySQL: Set user variable from result of query
查看>>
JVM调优之jstack找出最耗cpu的线程并定位代码
查看>>
厉害了,我的李楠!魅蓝E3发布会要上演“打飞机”?
查看>>
拿下中国物流界奥斯卡三项大奖,京东X事业部还有哪些黑科技
查看>>
天猫11·11:蚂蚁金服如何用小团队支撑数亿人买买买?
查看>>
阿里总部对外解密双11超级工程背后的数据库技术
查看>>
通信厂商做路由器,能做成什么样?
查看>>
福建漳州海域一货轮沉没 11人获救1人失联
查看>>
四川江安戏剧“青年训练营”:播撒颗颗戏剧种子
查看>>
中关村培养世界级科技领军企业
查看>>
香港最新失业率2.8% 劳工市场短期内料维持偏紧状态
查看>>
央行:中国金融风险总体收敛
查看>>
山西警方破获快递跨省运输贩毒案
查看>>
河北省政协十二届二次会议开幕
查看>>
沈阳国际冰雪季以“冰棋园”演绎冰雪“棋”迹
查看>>
为什么 Python 4.0 会与 Python 3.0 不同?
查看>>
Android无处不在,Android开发者大有可为
查看>>
Nodejs:使用Mongodb存储和提供后端CRD服务
查看>>
Dubbo配置直连
查看>>
一个小白的四次前端面试经历
查看>>