源码中看到val.toString === Object.prototype.toString

289 阅读1分钟

在啃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

image.png

我们可以看到不同类型的.toString都是不同的类型,但他们都是返回 ƒ toString() { [native code] }

因此我做了尝试

image.png

再去mdn搜索下

image.png 也就是说不同类型的原型都创建了toString方法 因此我们可以验证我们的猜想,val.toString === Object.prototype.toString为了判断val是Object