手记

JavaScript--toString()方法

每个对象都有一个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。

0人推荐
随时随地看视频
慕课网APP