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类型

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

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

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

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

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

    //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()去判断类型
穷则独善其身,达则兼济天下……
原文地址:https://www.cnblogs.com/hmy-666/p/14439886.html