obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样;
这是因为Object本身有toString方法,能返回具体类型。
而Array ,function等类型作为Object的实例,都重写了toString方法。
这些对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法,而不会去调用Object上原型toString方法。
所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。
var toString1=Object.prototype.toString;
var toString2={}.toString;
var bool=true;
var num=2;
var str="";
var fn=function(){};
var arr=[];
var date=new Date();
var reg=new RegExp();
var obj={};
console.log(bool.toString(), toString1.call(bool), toString2.call(bool)); console.log(num.toString(), toString1.call(num), toString2.call(num));
console.log(str.toString(), toString1.call(str), toString2.call(str));
console.log(fn.toString(), toString1.call(fn), toString2.call(fn));
console.log(arr.toString(), toString1.call(arr), toString2.call(arr));
console.log(date.toString(), toString1.call(date), toString2.call(date)); console.log(reg.toString(), toString1.call(reg), toString2.call(reg));
console.log(obj.toString(), toString1.call(obj), toString2.call(obj));
经测试,toString1 和 toString2作用是一样的 说明纯对象{}没有重写toString方法;而其他对象的toString都是重写过的,只是单纯地转换成字符串并返回。