JavaScript中的類型轉換(一)

來源:互聯網
上載者:User

JavaScript中的類型轉換(一)
前言         JavaScript是一種非常靈活的弱類型的語言,它的靈活性的一方面體現在其繁雜多樣的類型轉換。比如當JavaScript期望使用一個布爾值的時候(比如if語句中)你可以提供任一類型的值,JavaScript會按照需要自行轉換類型;當使用==操作符比較兩個類型值的時候,也會對兩個運算元按需進行轉換,同樣的事情也發生在使用+,>和<等操作符時。這些靈活繁雜的轉換往往會使初學者不知所措,本文對JavaScript的類型轉換做一個總結。 JavaScript中的類型分類        JavaScript中的類型可以分為兩大類:原始類型( primitive types)和物件類型(object types).其中原始類型包括數字number,字串string,布爾boolean,null和undefined五種;除此五種之外的類型都是物件類型(包括function,array,regex等). 原始類型到其他類型的轉換        JavaScript中對於不同類型值之間的轉換見下表(該表為<JavaScript權威指南>第三章表3-2) 值 字串 數字 布爾值 對象undefined “undefined” NaN false throws TypeErrornull “null” 0 false throws TypeErrortrue “true” 1 new Boolean(true)false “false” 0 new Boolean(false)“”(Null 字元串) 0 false new String(“”)“1.2” 1.2 true new String(“1.2”)“one” NaN true new  String(“one”)0 “0” false new Number(0)-0 “0” false new Number(-0)NaN “NaN” false new Number(NaN)Infinity “Infinity” true new Number(Infinity)-Infinity “-Infinity” true new Number(-Infinity)1(其他非無窮大的數字) “1” true new Number(1){} 待討論 待討論 true [] “” 0 true [9] “9” 9 true [‘a’] 使用join()方法串連各個元素,分隔字元為逗號 NaN true function(){} 待討論 NaN true         從上表可以看出,JavaScript中原始類型之間的類型轉換已經被明確定義,原始類型到對象的轉換也被明確定義,表格中有三個內容為"待討論"的儲存格,均是物件類型到原始類型之間的轉換,是JavaScript類型轉換的痛點。這裡簡單對前兩種情況做一下總結:只有undefined,null,Null 字元串,0(包括0和-0)和NaN轉換為布爾類型時會被轉換為false,其餘類型的值轉換成布爾類型都是true原始類型到物件類型的轉換,null和undefined會拋出異常,而number,string和bool則會轉換成對應的封裝類型Number,String,Boolean.對於這三種原始類型,也可以使用Object建構函式轉換成對象,Object建構函式會根據傳入參數的具體值來調用Number,String或者Boolean中的一個來構造對象.代碼如下複製代碼var num = new Number(10);var str = new String("abc");var boolean = new Boolean(false);var num1 = new Object(10);var str1 = new Object("abc");var boolean1 = new Boolean(false);console.log(typeof num + " " +num.constructor ); //輸出object function Number() { [native code] }console.log(typeof str + " " + str.constructor);//輸出object function String() { [native code] }console.log(typeof boolean + " " + boolean.constructor);//輸出object function Boolean() { [native code] }console.log(typeof num1 + " " + num1.constructor);//輸出object function Number() { [native code] }console.log(typeof str1 + " " + str1.constructor);//輸出object function String() { [native code] }console.log(typeof boolean1 + " " + boolean1.constructor);//輸出object function Boolean() { [native code] }複製代碼物件類型到原始類型的轉換       本小節中提到的"物件類型"僅指native objects,可以理解為由程式員定義的物件類型,不包括JavaScript宿主(比如瀏覽器)所定義的對象,因為宿主定義的對象可能有特殊的方法來進行類型轉換.另外本小區段標頭裡的原始類型僅包含bool,string和number三種類型,對象到null或者undefined的轉換不需要討論.而對象到bool類型的轉換在上面已經討論過,所有的物件類型轉換布爾類型都是true,即使new Boolean(false)轉換成布爾類型也是true.所以本小節值得討論的內容就剩下物件類型到字串的轉換與物件類型到數位轉換.         對象到字串和對象到數字類型的轉換涉及到兩個重要的方法,最終的轉換結果會受到這兩個方法返回結果的影響,這兩個方法就是toString和valueOf.所有的對象都會從Object對象中繼承到這兩個方法.toString方法 用於返回對象的字串表示(但是其實也可以不返回字串).對於預設從Object繼承而來的toString方法並不會返回太多有意義的內容.而valueOf方法目的是返回一個可以表示對象的原始類型值,但是由於對象的複雜性,大多數情況下根本不可能用一個原始類型值來表示,所以預設的valueOf只是返回對象自身.Date類型是一個特例,這是JavaScript預定義類型之中唯一重寫了toString和valueOf方法的類型. 物件類型轉換字串類型步驟如下: 如果對象有toString方法,就調用toString方法,如果返回的是一個原始類型,把這個原始類型轉換成字串(當然如果toString返回的就是字串就不需要了)如果對象沒有toString方法,或者toString返回的不是原始類型,就嘗試調用valueOf方法,如果valueOf方法返回的是原始類型,則將原始類型轉換成字串(如果valueOf放回的就是字串就不需要了)如果toString方法和valueOf方法都不存在,或者他們的傳回型別都不是原始類型,則拋出TypeError異常

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.