乐趣区

浅析ObjectprototypetoString

一直很奇怪为什么可以通过 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() 去判断类型
退出移动版