toString方法

每一個對象都有一個toString()方法。
默認狀況下,toString()方法被每一個Object對象繼承。
若是此方法在自定義對象中未被覆蓋,toString()返回「[object type]」,其中type是對象的類型。
例如:javascript

var obj = {}; obj.toString(); // [object Object]

若是此方法被自定義對象覆蓋,則根據被重寫後的toString方法返回結果。
例如:java

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]

不知道你們明不明白這是怎麼一回事,下面簡單說幾句:app

function的toString(),會直接返回這個方法的源碼,因此Person.toString()返回了自身的字符串表示。而person做爲Person類的實例對象,自身並無toString()方法,因此根據原型鏈person.toString()——>person.__proto__.toString()——>Person.prototype.toString()——>Person.prototype.__proto__.toString()——>Object.prototype.toString();this

前面提到了Object.prototype.toString()返回對象的類型,因此person.toString()返回了[object Object]。prototype

Object.prototype.toString()其實還有一個做用:能夠藉助call()或者apply()來判斷對象的類型。code

你們知道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。繼承

相關文章
相關標籤/搜索