一直很奇怪为何能够经过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]
Object.prototype.toString()是Object原型对象上的方法,返回的是表明该对象的字符串函数
var obj = {}; Object.toString(obj);//"function Object() { [native code] }" Object.prototype.toString.call(obj);//"[object Object]"
由于Array、String、Number、Boolean、RegExp、Date等类型都重写了toString(),若是直接调用则由于自身的原型对象上已有toString()方法,就不会调用到Object原型对象上的toString()方法了。
Array类型ui
//toString()返回数组中的 数值的字符串表达 var arr = ["cherry","rose"]; arr.toString();//"cherry,rose"
String类型this
//toString()返回字符串的字面量表示 var str = "my name is cherry" str.toString();//"my name is cherry"
Number类型prototype
//toString()返回 对应数值的字符串表达 var num = 18; num.toString();//"18"
Boolean类型code
//toString()返回布尔值的字符串表达 var bool = true; bool.toString();//"true";
RegExp类型对象
var patten = new RegExp("\\abc\\d",'gi'); patten.toString();//"/\abc/\d/gi"
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()去判断类型