当前位置: 移动技术网 > IT编程>脚本编程>vue.js > Vue源码中要const _toStr = Object.prototype.toString的原因分析

Vue源码中要const _toStr = Object.prototype.toString的原因分析

2019年05月24日  | 移动技术网IT编程  | 我要评论

上海庆春电影院,闻小雅,剑网3是免费的吗

在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(number(1))
"[object number]"

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

补充:object.prototype.tostring方法的原理

前言

我们在判断一个对象的内置类型时,我们一般可以使用以下方法:

var arr = [];
console.log(object.prototype.tostring.call(arr)) //"[object array]"

那么,这个方法的原理是什么呢?

ecmascript 3

在tostring方法被调用时,会执行下面的操作步骤:

1. 获取this对象的[[class]]属性的值.

2. 计算出三个字符串"[object ", 第一步的操作结果result(1), 以及 "]"连接后的新字符串.

3. 返回第二步的操作结果result(2).

[[class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中,[[class]]是这么定义的

[[class]] 一个字符串值,表明了该对象的类型.

然后给了一段解释:

所有内置对象的[[class]]属性的值是由本规范定义的.所有宿主对象的[[class]]属性的值可以是任意值,甚至可以是内置对象使用过的[[class]]属性的值.[[class]]属性的值可以用来判断一个原生对象属于哪种内置类型.需要注意的是,除了通过object.prototype.tostring方法之外,本规范没有提供任何其他方式来让程序访问该属性的值。

ecmascript 5

在tostring方法被调用时,会执行下面的操作步骤

如果this的值为undefined,则返回"[object undefined]".
如果this的值为null,则返回"[object null]".
让o成为调用toobject(this)的结果.
让class成为o的内部属性[[class]]的值.
返回三个字符串"[object ", class, 以及 "]"连接后的新字符串.
es5中,[[class]]属性的解释更加详细:

所有内置对象的[[class]]属性的值是由本规范定义的.所有宿主对象的[[class]]属性的值可以是除了"arguments", "array", "boolean", "date", "error", "function", "json", "math", "number", "object", "regexp", "string"之外的的任何字符串.[[class]]内部属性是引擎内部用来判断一个对象属于哪种类型的值的.需要注意的是,除了通过object.prototype.tostring方法之外,本规范没有提供任何其他方式来让程序访问该属性的值。

总而言之,要获取一个对象的真实的内置类型,我们需要通过获取[[class]]的属性值,在es5之前,该属性值只能通由object.prototype.tostring来访问,因此,通过object.prototype.tostring.call(arr)改变tostring方法的this指向,从而获得对象的内置类型。

总结

以上所述是小编给大家介绍的vue源码中要const _tostr = object.prototype.tostring的原因分析,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网