一、toString()是一個怎樣的方法?它是能將某一個值轉化為字串的方法。然而它是如何將一個值從一種型別轉化為字串型別的呢?
1.將boolean型別的值轉化為string型別:
console.log(true.toString());//"true" console.log(false.toString());//"false"
2.將string型別按其字面量形式輸出:
var str = "test123y"; console.log(str.toString());//"test123y"
3.將Object型別轉化成string型別(JavaScript原生的Array型別、Date型別、RegExp型別以及Number、Boolean、String這些包裝型別都是Object的子型別):
var obj = {name:"Tom", age:18}; console.log(obj.toString());//"[object Object]"此時呼叫的是從Object繼承來的原始的toString()方法
接下來的三個例子都是以重寫的方式實現了toString()方法;
1.Array型別:
var arr = ["tom",12,"rose",18]; console.log(arr.toString());//"tom,12,rose,18"
2.RegExp型別
var patten = new RegExp("\\[hbc\\]at", "gi"); console.log(patten.toString());//"/\[hbc\]at/gi"
3.Date型別
var date = new Date(2014,02,26);//注意這種格式建立的日期,其月份是3月 console.log(date.toString());//"Wed Mar 26 2014 00:00:00 GMT+0800"輸出格式因瀏覽器不同而不同,此為firefox的輸出格式;
4.Number型別也是以重寫的方式實現toString()方法的,請看以下例子:
(1)它可以接受一個整數引數,並將呼叫這個方法的數值轉化成相應進位制的字串:
var num = 16; console.log(num.toString(2));//10000 二進位制 console.log(num.toString(8));//20 八進位制 console.log(num.toString(16));//10 十六進位制 console.log(num.toString(5));//31 雖然沒有五進位制,但是這樣傳參是可以被toString()方法接受的
(2)再看下面的程式碼:
console.log(1.toString());//這種寫法會報錯語法錯誤,但是下面的寫法都是合法的; console.log((1).toString());//"1" console.log(typeof (1).toString());//string console.log(1..toString());//"1" console.log(typeof (1).toString());//string console.log(1.2.toString());//"1" console.log(typeof (1).toString());//string
(3)純小數的小數點後面有連續6或6個以上的“0”時,小數將用e表示法進行輸出;
var num = 0.000006;//小數點後面有5個“0” console.log(num.toString());//"0.000006" var num = 0.0000006;//小數點後面有6個“0” console.log(num.toString());//"6e-7"
(4)浮點數整數部分的位數大於21時,輸出時採用e表示法;
var num = 1234567890123456789012; console.log(num.toString());//"1.2345678901234568e+21"
看到這裡大家難免會有些疑問,這些基本的資料型別的值都是常量,而常量是沒有方法的,為什麼能夠呼叫方法呢?答案是這樣的,五種基本型別除了 null、undefined以外都有與之對應的特殊的引用型別——包裝型別。當程式碼被解釋執行時,底層會對基本型別做一個型別轉換,即將基本型別轉換成 引用型別,這樣就可以呼叫相應引用型別有權訪問到的方法。
二、toString()方法定義在何處?
var pro = Object.prototype; var pr = pro.__proto__;//ie11之前版本不支援該屬性 console.log(typeof pro);//"object" console.log(String(pro));//"[object Object]" console.log(pro.hasOwnProperty("toString"));//true console.log(typeof pr);//"object" console.log(String(pr));//"null" console.log(pr.hasOwnProperty("toString"));//報錯
三、使用Object.prototype上的原生toString()方法判斷資料型別,使用方法如下:
1.判斷基本型別:
Object.prototype.toString.call(null);//”[object Null]” Object.prototype.toString.call(undefined);//”[object Undefined]” Object.prototype.toString.call(“abc”);//”[object String]” Object.prototype.toString.call(123);//”[object Number]” Object.prototype.toString.call(true);//”[object Boolean]”
2.判斷原生引用型別:
Function fn(){console.log(“test”);} Object.prototype.toString.call(fn);//”[object Function]”
var date = new Date(); Object.prototype.toString.call(date);//”[object Date]”
var arr = [1,2,3]; Object.prototype.toString.call(arr);//”[object Array]”
var reg = /[hbc]at/gi; Object.prototype.toString.call(arr);//”[object Array]”
function Person(name, age) { this.name = name; this.age = age; } var person = new Person("Rose", 18); Object.prototype.toString.call(arr); //”[object Object]”
console.log(person instanceof Person);//輸出結果為true
3.判斷原生JSON物件:
var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON); console.log(isNativeJSON);//輸出結果為”[object JSON]”說明JSON是原生的,否則不是;
注意:Object.prototype.toString()本身是允許被修改的,而我們目前所討論的關於Object.prototype.toString()這個方法的應用都是假設toString()方法未被修改為前提的。
本文所討論內容多參考於《JavaScrip高階程式設計》第三版,另因個人水平有限,如有描述不當之處還請高手指正。