一直很奇怪为什么可以通过 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() 方法了。
-
Array 类型
//toString() 返回数组中的 数值的字符串表达 var arr = ["cherry","rose"]; arr.toString();//"cherry,rose"
-
String 类型
//toString() 返回字符串的字面量表示 var str = "my name is cherry" str.toString();//"my name is cherry"
-
Number 类型
//toString() 返回 对应数值的字符串表达 var num = 18; num.toString();//"18"
-
Boolean 类型
//toString() 返回布尔值的字符串表达 var bool = true; bool.toString();//"true";
-
RegExp 类型
var patten = new RegExp("\\abc\\d",'gi'); patten.toString();//"/\abc/\d/gi"
-
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() 去判断类型