在類型轉(zhuǎn)換中,經(jīng)常用到方法
valueOf()
和toString()
,所有對象(包括基本包裝類型)都擁有這兩個方法。這篇文章我們先看看valueOf()
方法。valueOf()
方法會將對象轉(zhuǎn)換為基本類型,如果無法轉(zhuǎn)換為基本類型,則返回原對象。
【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
如果是基本包裝類型對應(yīng)的基本類型,會返回原值。但這并不代表基本類型擁有valueOf()
方法(基本類型不是對象,不擁有任何方法),而是在讀取一個基本類型值時,后臺會創(chuàng)建一個對應(yīng)的基本包裝類型的對象,從而調(diào)用一些方法。所以,基本類型“調(diào)用”valueOf()
方法時,實際上是先創(chuàng)建了一個對應(yīng)的基本包裝類型,由此基本包裝類型調(diào)用valueOf()
,最后返回了其對應(yīng)的基本類型,看起來就好像是基本類型調(diào)用了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基本包裝類型和基本類型調(diào)用valueOf()方法都返回對應(yīng)的基本類型
【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基本包裝類型和基本類型調(diào)用valueOf()方法都返回對應(yīng)的基本類型。
注意,如果直接用整數(shù)調(diào)用時,要加上括號,否則會報錯。因為整數(shù)后面的點會識別為小數(shù)點。浮點型不會報錯。
console.log(123.valueOf());//Uncaught SyntaxError
console.log((123).valueOf());//123
console.log(12.3.valueOf());//12.3
【4】數(shù)組Array類型(返回原數(shù)組)
var a = [1];
console.log(a.valueOf());//[1]
console.log(a === a.valueOf());//true
【5】函數(shù)Function類型(返回原函數(shù))
var a = function(){};
console.log(a.valueOf());//function(){};
console.log(a === a.valueOf());//true
【6】正則RegExp類型(返回原正則對象)
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類型(返回表示當前時間的數(shù)值)
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
小結(jié):
undefined和null沒有此方法(基本類型肯定沒有方法,String、Number和Boolean是因為有對應(yīng)的基本包裝類型,才可以調(diào)用方法);
基本包裝類型和對應(yīng)的基本類型,調(diào)用valueOf()返回對應(yīng)的基本類型值;
對象類型(除Date類型)返回原對象;
Date類型返回表示日期的毫秒數(shù)
參考這位博主的文章