浅析Object.prototype.toString()

一直很奇怪为何能够经过Object.prototype.toString()判断各数据的类型,带着这个疑问,查看了一些资料。数组

1.Object.prototype.toString()判断原理

那么当咱们调用这个方法时,具体会作那些操做呢?
1.若是this value是undefined,返回 "[object Undefined]"
2.若是this value是null,返回"[object Null]"
3.让O做为ToOject(this value)方法的返回值
4.让isArray做为IsArray(O)方法的返回值
5.若是isArray为true,使builtinTag为"Array"
6.else 若是O包含[[ParameterMap]]internal slot,使builtinTag为"Arguments"
7.else 若是O包含[[Call]]internal method,使builtinTag为"Function"
8.else 若是O包含[[ErrorData]]internal slot,使builtinTag为"Error"
9.else 若是O包含[[BooleanData]]internal slot,使builtinTag为"Boolean"
10.else 若是O包含[[NumberData]]internal slot,使builtinTag为"Number"
11.else 若是O包含[[StringData]]internal slot,使builtinTag为"String"
12.else 若是O包含[[DateValue]]internal slot,使builtinTag为"Date"
13.else 若是O包含[[RegExpMatcher]]internal slot,使builtinTag为"RegExp"
14.else 使builtinTag为"Object"
15.让tag做为Get(O,@@toStringTag)的返回值
16.若是Type(tag)不是String,使tag为builtinTag的值
17.返回由"[object ",tag,"]"这三个字符串拼接的字符串
具体的解释可见[ECMAScript官方文档][1]

2.Object.prototype.toString()与Object.toString()的区别

  • Object.toString()是Object构造函数上的方法,返回的是对应的函数
  • Object.prototype.toString()是Object原型对象上的方法,返回的是表明该对象的字符串函数

    var obj = {};
    Object.toString(obj);//"function Object() { [native code] }"
    Object.prototype.toString.call(obj);//"[object Object]"

3.为何Array、String、Number、Boolean等不能直接调用toString()?

由于Array、String、Number、Boolean、RegExp、Date等类型都重写了toString(),若是直接调用则由于自身的原型对象上已有toString()方法,就不会调用到Object原型对象上的toString()方法了。
  1. Array类型ui

    //toString()返回数组中的 数值的字符串表达
    var arr = ["cherry","rose"];
    arr.toString();//"cherry,rose"
  2. String类型this

    //toString()返回字符串的字面量表示
    var str = "my name is cherry"
    str.toString();//"my name is cherry"
  3. Number类型prototype

    //toString()返回 对应数值的字符串表达
    var num = 18;
    num.toString();//"18"
  4. Boolean类型code

    //toString()返回布尔值的字符串表达
    var bool = true;
    bool.toString();//"true";
  5. RegExp类型对象

    var patten = new RegExp("\\abc\\d",'gi');
    patten.toString();//"/\abc/\d/gi"
  6. Date类型ip

    //toString() 返回当前时间的标准时间字符串表达
    var date = new Date(2019/07/07);
    date.toString();//"Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)

结语

1. 首先须要了解Object.prototype.toString()的原理和各值返回的字符串。
2. Object.prototype.toString()与Object.toString()是两个不一样的方法,他们返回的值是不同的。前者返回的是该对象类型的字符串,后者返回的是一个函数代码
3.为何数组、布尔等不直接调用toString(),由于它们本身的原型对象上重写了toString()表明各自不一样的逻辑。须要调用Ojbect原型对象上的toString()去判断类型
相关文章
相关标签/搜索