在vue的源码中,vue/src/shared/util.js文件中存放的是一些方法。其中作者用了 .prototype.toString这个方法来判断类型,但是并没有直接用,而是单独保存在一个变量:
const _toStr = .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\'
)
}
判断 也做了区分,is 和isPlain :
export function is (obj: mixed): boolean %checks {
return obj !== null && typeof obj === \' \'
}
export function isPlain (obj: any): boolean {
return _toString.call(obj) === \'[ ]\'
}
到了判断复杂类型的时候,一般我们用 .prototype.toString或者是instanceof。如果是前者的话会返回类似\'[ ]\'的字符串。后者则会判断一个对象的原型链上是否存在一个构造函数。
两者还有一些不同。 .prototype.toString.call(1) 和 .prototype.toString.call(Number(1))时,返回的都是\"[ Number]\",也就是说,它并不能区分原始类型和复杂类型。可见, .prototype.toString.call并不像很多教程说的那样好用。
.prototype.toString.call(1) \"[ Number]\" .prototype.toString.call(Number(1)) \"[ Number]\"
如果要使用,就需要像尤大一样,把原始类型单独拎出来判断,再去判断复杂类型,而走到这一步的时候尤大就写了上面说那行const _toStr。这是因为,toString实在是太容易被重写了。如果toString被其他人重写,将会对代码中涉及到的部分造成影响,所以就保存下来防止这种情况发生。
补充: .prototype.toString方法的原理
前言
我们在判断一个对象的内置类型时,我们一般可以使用以下方法:
var arr = []; console.log( .prototype.toString.call(arr)) //\"[ Array]\"
那么,这个方法的原理是什么呢?
ECMA 3
在toString方法被调用时,会执行下面的操作步骤:
1. 获取this对象的[[Class]]属性的值.
2. 计算出三个字符串\"[ \", 第一步的操作结果Result(1), 以及 \"]\"连接后的新字符串.
3. 返回第二步的操作结果Result(2).
[[Class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中,[[Class]]是这么定义的
[[Class]] 一个字符串值,表明了该对象的类型.
然后给了一段解释:
所有内置对象的[[Class]]属性的值是由本规范定义的.所有宿主对象的[[Class]]属性的值可以是任意值,甚至可以是内置对象使用过的[[Class]]属性的值.[[Class]]属性的值可以用来判断一个原生对象属于哪种内置类型.需要注意的是,除了通过 .prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值。
ECMA 5
在toString方法被调用时,会执行下面的操作步骤
如果this的值为undefined,则返回\"[ Undefined]\".
如果this的值为null,则返回\"[ Null]\".
让O成为调用To (this)的结果.
让class成为O的内部属性[[Class]]的值.
返回三个字符串\"[ \", class, 以及 \"]\"连接后的新字符串.
ES5中,[[Class]]属性的解释更加详细:
所有内置对象的[[Class]]属性的值是由本规范定义的.所有宿主对象的[[Class]]属性的值可以是除了\"Arguments\", \"Array\", \"Boolean\", \"Date\", \"Error\", \"Function\", \"JSON\", \"Math\", \"Number\", \" \", \"RegExp\", \"String\"之外的的任何字符串.[[Class]]内部属性是引擎内部用来判断一个对象属于哪种类型的值的.需要注意的是,除了通过 .prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值。
总而言之,要获取一个对象的真实的内置类型,我们需要通过获取[[Class]]的属性值,在es5之前,该属性值只能通由 .prototype.toString来访问,因此,通过 .prototype.toString.call(arr)改变tostring方法的this指向,从而获得对象的内置类型。
总结
以上所述是小编给大家介绍的Vue源码中要const _toStr = .prototype.toString的原因分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
继续阅读与本文标签相同的文章
快速卸载易语言步骤
“J.U.C”:Semaphore
-
如何实现一次编码,到处运行?新一代云端一体化探索
2026-05-19栏目: 教程
-
阿里有个组织超神秘,CEO们来了都要翻牌
2026-05-19栏目: 教程
-
直播源码进行直播间搭建时重要一项--DNS负载均衡
2026-05-19栏目: 教程
-
阿里云提供全托管 ZooKeeper
2026-05-19栏目: 教程
-
它是第一个入驻阿里云自营心选商城的SaaS企业,如今营收已过亿
2026-05-19栏目: 教程
