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()去判断类型