JS中的toString、Object.toString、Object.prototype.toString

不同類型值的toString方法:

//Number
const num = 123;
num.toString();        // '123'
(123).toString();      // '123' 整數必須賦值給變量後或放在括號中再調用toString
1.23.toString();       // '1.23' 小數可直接調用

NaN.toString();        // 'NaN'
Infinity.toString();   // 'Infinity'

-Infinity.toString();  // -Infinity 根據運算符優先級關係,先執行toString再將String轉爲Number

//數字通過toString進行進制轉換
num.toString();        // '123' 默認轉爲十進制
num.toString(2);       // '1111011'
num.toString(8);       // '173'
num.toString(16);      // '7b'


//Array
[1,2,3].toString();    // '1,2,3' 結果與數組的join()方法相同


//Object
({}).toString();       // "[object Object]"


//Function
const func = function(){};
func.toString();       // "function(){}"


//Boolean
const t = true, f = false;
t.toString();          // 'true' 返回對應字符串
f.toString();          // 'false' 


//undefined、null對象沒有toString方法

 

Object.toString與Object.prototype.toString的區別

首先明確一下toString相同的調用方式:

console.log(toString === window.toString); // true
console.log(window.toString === Object.prototype.toString); // true

Object原型鏈上的toString方法可以用於對象類型的判斷,如常用的區分數組與普通對象。(參考文章

Object.prototype.toString.call('');                            //[object String]
Object.prototype.toString.call(1);                             //[object Number]
Object.prototype.toString.call(true);                          //[object Boolean]
Object.prototype.toString.call([]);                            //[object Array]
Object.prototype.toString.call({});                            //[object Object]
Object.prototype.toString.call(undefined);                     //[object Undefined]
Object.prototype.toString.call(null);                          //[object Null]
Object.prototype.toString.call(new Function());                //[object Function]
Object.prototype.toString.call(new Date());                    //[object Date]
Object.prototype.toString.call(new RegExp());                  //[object RegExp]
Object.prototype.toString.call(new Error());                   //[object Error]

Object.prototype.toString.call(document);                      //[object HTMLDocument]
document.toString();                                           //[object HTMLDocument]
Object.prototype.toString.call(window);                        //[object Window]
window.toString();                                             //[object Window]


//toString通過原型鏈調用Object.prototype.toString,可達到同樣效果
toString.call([]);                                             //[object Array]

 

由此而引出疑問,爲何通過Object.toString的方式不能調用原型鏈上的toString方法呢?

雖然所有對象的原型鏈最頂端都是Object.prototype,但同時Object本身也是一個構造函數,繼承於Function,調用Object.toString最終通過原型鏈調用的是Function.prototype.toString。相關關係如下:

Object.prototype.__proto__ === null; // true
Function.prototype.__proto__ === Object.prototype; //true

Object.toString === Function.prototype.toString; //true

 

JS內置對象即構造函數的toString方法

Number、String,Boolean,Array,RegExp、Date、Function等內置對象均重寫了Object原型上的toString方法,作用爲將當前數據類型轉爲字符串類型。

Number.toString();           // "function Number() { [native code] }"
String.toString();           // "function String() { [native code] }"
Boolean.toString();          // "function Boolean() { [native code] }"
Array.toString();            // "function Array() { [native code] }"
RegExp.toString();           // "function RegExp() { [native code] }"
Date.toString();             // "function Date() { [native code] }"
RegExp.toString();           // "function RegExp() { [native code] }"
Function.toString();         // "function Function() { [native code] }"

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章