你不知道的toString方法

一褥赊、toString()是一個怎樣的方法糕档?它是能將某一個值轉(zhuǎn)化為字符串的方法。然而它是如何將一個值從一種類型轉(zhuǎn)化為字符串類型的呢拌喉?

通過下面幾個例子速那,我們便能獲得答案:

1.將boolean類型的值轉(zhuǎn)化為string類型:

console.log(true.toString());//"true"
console.log(false.toString());//"false"

2.將string類型按其字面量形式輸出:

var str = "test123y";
console.log(str.toString());//"test123y"

3.將Object類型轉(zhuǎn)化成string類型(JavaScript原生的Array類型、Date類型尿背、RegExp類型以及Number端仰、Boolean、String這些包裝類型都是Object的子類型):
自定義Object類型(沒有重新定義toString方法):

var obj = {name:"Tom", age:18};
console.log(obj.toString());//"[object Object]"此時調(diào)用的是從Object繼承來的原始的toString()方法

接下來的三個例子都是以重寫的方式實現(xiàn)了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);//注意這種格式創(chuàng)建的日期榆俺,其月份是3月
console.log(date.toString());//"Wed Mar 26 2014 00:00:00 GMT+0800"輸出格式因瀏覽器不同而不同,此為firefox的輸出格式坞淮;

4.Number類型也是以重寫的方式實現(xiàn)toString()方法的茴晋,請看以下例子:
(1)它可以接受一個整數(shù)參數(shù),并將調(diào)用這個方法的數(shù)值轉(zhuǎn)化成相應(yīng)進制的字符串:

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

這是因為javascript引擎在解釋代碼時對于“1.toString()”認為“.”是浮點符號啡直,但因小數(shù)點后面的字符是非法的烁涌,所以報語法錯誤苍碟;
而后面的“1..toString()和1.2.toStirng()”寫法,javascript引擎認為第一個“.”小數(shù)點撮执,的二個為屬性訪問語法微峰,所以都能正確解釋執(zhí)行;
對于“(1).toStirng()”的寫法抒钱,用“()”排除了“.”被視為小數(shù)點的語法解釋蜓肆,所以這種寫法能夠被解釋執(zhí)行;
(3)純小數(shù)的小數(shù)點后面有連續(xù)6或6個以上的“0”時谋币,小數(shù)將用e表示法進行輸出仗扬;

var num = 0.000006;//小數(shù)點后面有5個“0”
console.log(num.toString());//"0.000006"
var num = 0.0000006;//小數(shù)點后面有6個“0”
console.log(num.toString());//"6e-7"

(4)浮點數(shù)整數(shù)部分的位數(shù)大于21時,輸出時采用e表示法蕾额;

var num = 1234567890123456789012;
console.log(num.toString());//"1.2345678901234568e+21"

看到這里大家難免會有些疑問早芭,這些基本的數(shù)據(jù)類型的值都是常量,而常量是沒有方法的诅蝶,為什么能夠調(diào)用方法呢退个?答案是這樣的,五種基本類型除了null秤涩、undefined以外都有與之對應(yīng)的特殊的引用類型——包裝類型帜乞。當代碼被解釋執(zhí)行時,底層會對基本類型做一個類型轉(zhuǎn)換筐眷,即將基本類型轉(zhuǎn)換成引用類型,這樣就可以調(diào)用相應(yīng)引用類型有權(quán)訪問到的方法习柠。
二匀谣、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"));//報錯

由此可知资溃,toString()定義在Object.prototype上武翎;
三、使用Object.prototype上的原生toString()方法判斷數(shù)據(jù)類型溶锭,使用方法如下:

Object.prototype.toString.call(value)

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.判斷原生引用類型:
函數(shù)類型

Function fn(){console.log(“test”);}
Object.prototype.toString.call(fn);//”[object Function]”

日期類型

var date = new Date();
Object.prototype.toString.call(date);//”[object Date]”

數(shù)組類型

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]”

很明顯這種方法不能準確判斷person是Person類的實例宝恶,而只能用instanceof 操作符來進行判斷,如下所示:

console.log(person instanceof Person);//輸出結(jié)果為true

3.判斷原生JSON對象:

var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON);
console.log(isNativeJSON);//輸出結(jié)果為”[object JSON]”說明JSON是原生的趴捅,否則不是垫毙;

注意:Object.prototype.toString()本身是允許被修改的,而我們目前所討論的關(guān)于Object.prototype.toString()這個方法的應(yīng)用都是假設(shè)toString()方法未被修改為前提的拱绑。
本文所討論內(nèi)容多參考于《JavaScrip高級編程》第三版综芥,另因個人水平有限,如有描述不當之處還請高手指正猎拨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膀藐,一起剝皮案震驚了整個濱河市屠阻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌额各,老刑警劉巖国觉,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虾啦,居然都是意外死亡蛉加,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門缸逃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來针饥,“玉大人,你說我怎么就攤上這事需频《⊙郏” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵昭殉,是天一觀的道長苞七。 經(jīng)常有香客問我,道長挪丢,這世上最難降的妖魔是什么蹂风? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮乾蓬,結(jié)果婚禮上惠啄,老公的妹妹穿的比我還像新娘。我一直安慰自己任内,他們只是感情好撵渡,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著死嗦,像睡著了一般趋距。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上越除,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天节腐,我揣著相機與錄音,去河邊找鬼摘盆。 笑死翼雀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的骡澈。 我是一名探鬼主播锅纺,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肋殴!你這毒婦竟也來了囤锉?” 一聲冷哼從身側(cè)響起坦弟,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎官地,沒想到半個月后酿傍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡驱入,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年赤炒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亏较。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡莺褒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雪情,到底是詐尸還是另有隱情遵岩,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布巡通,位于F島的核電站尘执,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宴凉。R本人自食惡果不足惜誊锭,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弥锄。 院中可真熱鬧丧靡,春花似錦、人聲如沸叉讥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽图仓。三九已至,卻和暖如春但绕,著一層夾襖步出監(jiān)牢的瞬間救崔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工捏顺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留六孵,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓幅骄,卻偏偏與公主長得像劫窒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拆座,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • toStirng()與Object.prototype.toString.call()方法淺談 一主巍、toStrin...
    Michael_林閱讀 1,041評論 1 4
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,216評論 0 4
  • 09年結(jié)婚冠息,轉(zhuǎn)眼間就到了2016年,馬上要迎來7年結(jié)婚紀念日了孕索。結(jié)婚這么多年逛艰,終于找到了適合我們夫妻的一些相處...
    花不言閱讀 631評論 0 1
  • 今天的月亮很圓很亮,照得我不敢直視搞旭,猶如黑暗中的妖怪散怖,見到月光會死。我這次做的好絕肄渗,把所有的關(guān)系都割斷掉镇眷,因為,我...
    罅02閱讀 151評論 0 0
  • 咪蒙公眾號 2017.03.27 原標題 "慢慢愛上你翎嫡,慢慢慢慢慢慢忘記你" 我來改標題 ①你們男人都這么快欠动,這樣...
    永利哥閱讀 236評論 0 2