每个对象都有一个toString()方法。默认情况下,toString()方法由每个Object对象继承。如果在自定义对象中未覆盖此方法,则toString()返回“[objecttype]”,其中type是对象的类型。例如:varobj={};obj.toString();//[objectObject]如果此方法被自定义对象重写,则结果将根据重写的toString方法返回。例如:varnum=123;num.toString();//123因为Number对象在原型上有自己的toString()方法,即Number.prototype.toString()Array对象的toString()方法,将数组转换为字符串并返回结果。Boolean对象的toString()方法将布尔值转换为字符串并返回结果。Date对象的toString()方法将Date对象转换为字符串并返回结果。Number对象的toString()方法使用指定的基数(默认为10)将数字转换为字符串。String对象的toString()方法返回String对象的字符串(值)。以上对象的toString()方法都在自己的prototype上,也就是在prototype上。特例:undefined,null没有toString()方法。可能有些朋友对function有疑惑,比如下面这个例子:functionPerson(name){this.name=name;}varperson=newPerson("ming");console.日志(Person.toString());//函数Person(name){this.name=name;}console.log(person.toString());//[objectObject]不知道大家有没有看明白是怎么一回事,下面简单说几句:function的toString()会直接返回这个方法的源码,所以Person.toString()返回它自己的字符串表示形式。person作为Person类的实例对象,本身并没有toString()方法,所以根据原型链person.toString()—>person.__proto__.toString()—>Person.prototype.toString()——>人.prototype.__proto__.toString()——>对象.prototype.toString();前面说过,Object.prototype.toString()返回的是对象的类型,所以person.toString()返回的是[objectObject]。Object.prototype.toString()其实还有一个作用:可以使用call()或apply()来判断对象的类型。我们都知道typeof对对象类型的判断不是很准确,一些基本类型是可以判断的,ArrayObjectNull会判断为Object,那怎么办呢?相信你已经猜到了,我们直接进入正题:Object.prototype.toString.call(null);//[objectNull]vararr=[];Object.prototype.toString.call(arr);//[objectArray]Object.prototype.toString的行为:首先获取对象的一个??内部属性[[Class]],然后根据这个属性返回一个类似于“[objecttype]”的字符串作为结果(读过ECMA标准的应该知道[[]]用来表示语言内部使用,外部不能直接访问的属性,称为“内部属性”)。将此方法与call()方法结合使用,将toString方法的this引用改为待检测对象,即可获取任意对象的内部属性[[Class]],并最终返回其类型。
