不同類型值的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] }"