在類型轉換中,經常用到方法
valueOf()
和toString()
,上一篇講了valueOf()方法,這一篇來說說toString()
方法。toSting()
方法返回返回對象的字符串表現(xiàn)。
【1】基本包裝類型——Boolean型
var obj = new Boolean(true);
console.log(obj.toString());//"true"
console.log(typeof obj.toString());//string
//如果是包裝類型的基本類型,則返回原基本類型值
var a = true;
console.log(a.toString());//"true"
console.log(typeof a.toString());//string
如果是基本包裝類型對應的基本類型,會返回原值。但這并不代表基本類型擁有toString()方法(基本類型不是對象,不擁有任何方法),而是在讀取一個基本類型值時,后臺會創(chuàng)建一個對應的基本包裝類型的對象,從而調用一些方法。所以,基本類型“調用”toString()
方法時,實際上是先創(chuàng)建了一個對應的基本包裝類型,由此基本包裝類型調用toString()
最后返回了其對應的字符串,看起來就好像是基本類型調用了toString()
方法而得到了對應的字符串。
【2】基本包裝類型——String型
var obj = new String("hello");
console.log(obj.toString());//hello
console.log(typeof obj.toString());//string
//如果是包裝類型的基本類型,則返回原基本類型值
var a = "hello";
console.log(a.toString());//hello
console.log(typeof a.toString());//string
同【1】,String基本包裝類型和基本類型調用toString()方法都返回對應的字符串
【3】基本包裝類型——Number型
var obj = new Number("123");
console.log(obj.toString());//123
console.log(typeof obj.toString());//string
//如果是包裝類型的基本類型,則返回原基本類型值
var a = 123;
console.log(a.toString());//123
console.log(typeof a.toString());//string
同【1】,Number基本包裝類型和基本類型調用toString()方法都返回對應的字符串。
注意,如果直接用整數(shù)調用時,要加上括號,否則會報錯。因為整數(shù)后面的點會識別為小數(shù)點。浮點型不會報錯。
console.log(123.toString());//Uncaught SyntaxError
console.log((123).toString());//"123"
console.log(12.3.toString());//"12.3"
此外,數(shù)字類型的toString()方法可以接收表示轉換基數(shù)(可選,2-36中的任何數(shù)字),如果不指定此參數(shù),轉換規(guī)則將是基于十進制。
var n = 33;
console.log(n.toString());//'33'
console.log(n.toString(2));//'100001'
console.log(n.toString(3));//'41'
console.log(n.toString(10));//'33'
console.log(n.toString(16));//'21'
console.log(n.toString(37));//Uncaught RangeError: toString() radix argument must be between 2 and 36
【4】數(shù)組Array類型(返回數(shù)組內容組成的字符串)
var a = [1,2,3,4];
console.log(a.toString());//"1,2,3,4"
console.log(typeof a.toString());//string
【5】函數(shù)Function類型(返回函數(shù)代碼字符串)
var a = function(){};
console.log(a.toString());//"function(){};"
console.log(typeof a.toString());//string
【6】正則RegExp類型(返回原正則表達式的字符串表示)
var a = /a/g;
console.log(a.toString());///"a/g"
console.log(typeof a.toString());//string
【7】Date類型(返回表示當前時間的字符串)
var obj = new Date();
console.log(obj);//Wed May 10 2017 18:20:05 GMT+0800 (中國標準時間)
console.log(typeof obj);//object
console.log(obj.toString());//"Wed May 10 2017 18:20:05 GMT+0800 (中國標準時間)"
console.log(typeof obj.toString());//string
【8】對象Object類型及自定義對象類型(返回[object Object])
var obj = {a:1};
console.log(obj.toString());//"[object Object]"
console.log(typeof obj.toString());//string
function Foo(){};
var foo = new Foo();
console.log(foo.toString());//"[object Object]"
console.log(typeof foo.toString());//string
在判斷對象的類型時,用Object.prototype.toString()返回字符串“[object 對象類型]”,但無法判斷自定義對象的類型。
【小結】:
undefined
和null
沒有此方法(基本類型肯定沒有方法,String、Number和Boolean
是因為有對應的基本包裝類型,才可以調用方法);Date
類型返回表示時間的字符串;Object
類型返回字符串[object Object]
【與valueOf()
對比】
toString()
和valueOf()
的主要不同點在于,toString()
返回的是字符串,而valueOf()
返回的是原對象由于
undefined
和null
不是對象,所以它們toString()
和valueOf()
兩個方法都沒有數(shù)值
Number
類型的toString()
方法可以接收轉換基數(shù),返回不同進制的字符串形式的數(shù)值;而valueOf()
方法無法接受轉換基數(shù)時間
Date
類型的toString()
方法返回的表示時間的字符串表示;而valueOf()
方法返回的是現(xiàn)在到1970年1月1日00:00:00的數(shù)值類型的毫秒數(shù)包裝對象的
valueOf()
方法返回該包裝對象對應的原始值
【與轉型函數(shù)String()
函數(shù)的對比】
toString()
和String()
都是將數(shù)據(jù)轉換為對應的字符串,有如下區(qū)別:
-
String()
可以將任何類型的值轉換為字符串,包括undefined和null
console.log(String(null));//"null"
console.log(String(undefined));//"undefined"
-
String()
不能接受數(shù)值基數(shù)作為參數(shù)
引用自這位博主的文章