每个对象都有一个toString()方法。
默认情况下,toString()方法被每个Object对象继承。
如果此方法在自定义对象中未被覆盖,toString()返回“[object type]”,其中type是对象的类型。
例如:var obj = {}; obj.toString(); // [object Object]
如果此方法被自定义对象覆盖,则根据被重写后的toString方法返回结果。
例如:
var num = 123;
num.toString(); // 123
因为Number对象在原型上有自己的toString()方法,即Number.prototype.toString()
Array对象的toString()方法,把数组转换为字符串,并返回结果。
Boolean对象的toString()方法,把布尔值转换为字符串,并返回结果。
Date对象的toString()方法,把Date对象转换为字符串,并返回结果。
Number对象的toString()方法,把数字转换为字符串,用指定的基数(默认10)。
String对象的toString()方法,返回String对象的字符串(值)。
以上对象的toString()方法都是在自身原型上,也就是prototype上。
特例:undefined、null没有toString()方法
有的小伙伴对于function会有疑问,如下面例子:
function Person(name) {
this.name = name;
}
var person = new Person("ming");
console.log(Person.toString()); // function Person(name) { this.name = name; }
console.log(person.toString()); // [object Object]
不知道大家明不明白这是怎么一回事,下面我来简单说几句:
function的toString(),会直接返回这个方法的源码,所以Person.toString()返回了自身的字符串表示。而person作为Person类的实例对象,自身并没有toString()方法,所以根据原型链person.toString()——>person.__proto__.toString()——>Person.prototype.toString()——>Person.prototype.__proto__.toString()——>Object.prototype.toString();
前面提到了Object.prototype.toString()返回对象的类型,所以person.toString()返回了[object Object]。
Object.prototype.toString()其实还有一个作用:可以借助call()或者apply()来判断对象的类型。
大家知道typeof判断对象类型不是很准确,一些基本类型可以判断出来,而Array Object Null都会判断为Object,那怎么办呢?相信大家都猜到了,直接进入正题:
Object.prototype.toString.call(null); // [object Null]
var arr = [];
Object.prototype.toString.call(arr); // [object Array]
Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后根据这个属性,返回一个类似于“[object type]”的字符串作为结果(看过ECMA标准的应该知道[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为”内部属性“)。利用这个方法在配合call()方法改变toString方法的this引用为待检测对象,就可以取得任何对象的内部属性[[Class]],最后返回其type。