在啃vue源码过程中看到:
const _toString = Object.prototype.toString
/**
* Convert a value to a string that is actually rendered.
* 将值转换为实际呈现的字符串
*/
export function toString (val: any): string {
return val == null
? ''
: Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
? JSON.stringify(val, null, 2)
: String(val)
}
我们捋一下。 val是空值直接返回空字符串'',否则进行判断 val是数组或者val是对象obj(isPlainObject用来判断是否是对象),并且一个条件(待定)。满足则返回带2个空白缩进的json字符串,否则直接转换为string
这个条件写法是val.toString === Object.prototype.toString,这里用的全等,因此可以先猜想是为了判断val是Object。我的印象里val.toString不是一直等于Object.prototype.toString吗
''.toString === Object.prototype.toString // false
[].toString === Object.prototype.toString // false
new Object().toString === Object.prototype.toString // true
let functionC = function(){
return ''
}
functionC.toString === Object.prototype.toString //false
我们可以看到不同类型的.toString都是不同的类型,但他们都是返回 ƒ toString() { [native code] }
因此我做了尝试
再去mdn搜索下
也就是说不同类型的原型都创建了toString方法 因此我们可以验证我们的猜想,val.toString === Object.prototype.toString为了判断val是Object