在類型轉換中,經常用到方法valueOf()和他toString(),所有對象(包括基本包裝類型)都擁有這兩個方法。這篇文章我們先看看valueOf()方法。valueOf()方法會將對象轉換為基本類型,如果無法轉換為基本類型,則返回原對象。
【1】基本包裝類型——Boolean型
var obj = new Boolean(true); console.log(obj.valueOf());//true console.log(typeof obj.valueOf());//boolean //如果是包裝類型的基本類型,則返回原基本類型值 var a = true; console.log(a.valueOf());//true console.log(typeof a.valueOf());//boolean
如果是基本包裝類型對應的基本類型,會返回原值。但這並不代表基本類型擁有valueOf()方法(基本類型不是對象,不擁有任何方法),而是在讀取一個基本類型值時,后台會創建一個對應的基本包裝類型的對象,從而調用一些方法。所以,基本類型“調用”valueOf()方法時,實際上是先創建了一個對應的基本包裝類型,由此基本包裝類型調用valueOf(),最后返回了其對應的基本類型,看起來就好像是基本類型調用了valueOf()方法而得到了原始值。
【2】基本包裝類型——String型
var obj = new String("hello"); console.log(obj.valueOf());//hello console.log(typeof obj.valueOf());//string //如果是包裝類型的基本類型,則返回原基本類型值 var a = "hello"; console.log(a.valueOf());//hello console.log(typeof a.valueOf());//string
同【1】,String基本包裝類型和基本類型調用valueOf()方法都返回對應的基本類型
【3】基本包裝類型——Number型
var obj = new Number("123"); console.log(obj.valueOf());//123 console.log(typeof obj.valueOf());//number //如果是包裝類型的基本類型,則返回原基本類型值 var a = 123; console.log(a.valueOf());//123 console.log(typeof a.valueOf());//number
同【1】,Number基本包裝類型和基本類型調用valueOf()方法都返回對應的基本類型。
注意,如果直接用整數調用時,要加上括號,否則會報錯。因為整數后面的點會識別為小數點。浮點型不會報錯。
console.log(123.valueOf());//Uncaught SyntaxError console.log((123).valueOf());//123 console.log(12.3.valueOf());//12.3
【4】數組Array類型(返回原數組)
var a = [1]; console.log(a.valueOf());//[1] console.log(a === a.valueOf());//true
【5】函數Function類型(返回原函數)
var a = function(){}; console.log(a.valueOf());//function(){}; console.log(a === a.valueOf());//true
var a = /a/g; console.log(a.valueOf());///a/g console.log(a === a.valueOf());//true
【7】對象Object類型
var obj = {a:1}; console.log(obj.valueOf());//Object{a:1} console.log(obj === obj.valueOf());//true
【8】Date類型(返回表示當前時間的數值)
var obj = new Date(); console.log(obj);//Wed May 10 2017 12:19:05 GMT+0800 (中國標准時間) console.log(obj.valueOf());//1494389910179 console.log(obj === obj.valueOf());//false console.log(obj.getTime() === obj.valueOf());//true
小結
1)undefined和null沒有此方法(基本類型肯定沒有方法,String、Number和Boolean是因為有對應的基本包裝類型,才可以調用方法);
2)基本包裝類型和對應的基本類型,調用valueOf()返回對應的基本類型值;
3)對象類型(除Date類型)返回原對象;
4)Date類型返回表示日期的毫秒數