JS類型轉換規則詳解


JS類型轉換規則詳解

一、總結

一句話總結:JS強制類型轉換中的類型名強制類型轉換和其它語言不同,是類型類的構造方法,Number(mix)

一句話總結(JS類型本質):因為js是弱類型語言,所以它相較於強類型語言一定在類型(比如類型裝換)方面做了很多努力,才能使弱類型語言用的舒服。

 

1、在js中,和php中intval等函數等價的類型轉換函數時什么?

parseInt等parse類函數

parseInt(string,radix)、parseFloat(string)

2、js中的類型名的強制類型轉換有什么規則?

類名,類的構造方法,和c++和java不同(全稱,大寫)

Number(mix)、    String(mix)、    Boolean(mix)

 

3、用於檢測是否為非數值的函數是什么?

isNaN(mix)

 

4、js中的類型隱式轉換的條件是什么?

各種運算符,包括==比較運算符,還有++,大於小於等等

 

5、js中強制類型裝換的兩種方式是什么?

類型轉換函數:parseInt(string,radix)、parseFloat(string)toString(radix)

類型類的構造方法:Number(mix)、Boolean(mix)

 

二、JS類型轉換(強制和自動的規則)

顯式轉換

通過手動進行類型轉換,Javascript提供了以下轉型函數:

轉換為數值類型:Number(mix)、parseInt(string,radix)、parseFloat(string)
轉換為字符串類型:toString(radix)、String(mix)
轉換為布爾類型:Boolean(mix)
  • 1、Number(mix)函數,可以將任意類型的參數mix轉換為數值類型。其規則為:

    (1)如果是布爾值,true和false分別被轉換為1和0
    (2)如果是數字值,返回本身。
    (3)如果是null,返回0.
    (4)如果是undefined,返回NaN。
    (5)如果是字符串,遵循以下規則:
            1、如果字符串中只包含數字,則將其轉換為十進制(忽略前導0)
            2、如果字符串中包含有效的浮點格式,將其轉換為浮點數值(忽略前導0)
            3、如果是空字符串,將其轉換為0
            4、如果字符串中包含非以上格式,則將其轉換為NaN
    (6)如果是對象,則調用對象的valueOf()方法,然后依據前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,再次依照前面的規則轉換返回的字符串值。

下表列出了對象的valueOf()的返回值:

對象 返回值
Array 數組的元素被轉換為字符串,這些字符串由逗號分隔,連接在一起。其操作與 Array.toString 和 Array.join 方法相同。
Boolean Boolean 值。
Date 存儲的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC。
Function 函數本身。
Number 數字值。
Object 對象本身。這是默認情況。
String 字符串值。

下面提供幾個例子,你能寫出它的正確結果嗎:

Number(“hello CSSer!”);
Number(“0×8″);
Number(“”);
Number(“020dd”);
Number(“070″);
Number(true);

  • 2、parseInt(string, radix)函數,將字符串轉換為整數類型的數值。它也有一定的規則:

    (1)忽略字符串前面的空格,直至找到第一個非空字符
    (2)如果第一個字符不是數字符號或者負號,返回NaN
    (3)如果第一個字符是數字,則繼續解析直至字符串解析完畢或者遇到一個非數字符號為止
    (4)如果上步解析的結果以0開頭,則將其當作八進制來解析;如果以0x開頭,則將其當作十六進制來解析
    (5)如果指定radix參數,則以radix為基數進行解析

    小測驗:
    parseInt(“hello CSSer!”);
    Number(“0×8″);
    parseInt(“”);
    parseInt(“020dd”);
    parseInt(“070″);
    parseInt(“22.5″);

  • 3、parseFloat(string)函數,將字符串轉換為浮點數類型的數值。

    它的規則與parseInt基本相同,但也有點區別:字符串中第一個小數點符號是有效的,另外parseFloat會忽略所有前導0,如果字符串包含一個可解析為整數的數,則返回整數值而不是浮點數值。
  • 4、toString(radix)方法。除undefined和null之外的所有類型的值都具有toString()方法,其作用是返回對象的字符串表示。

對象 操作
Array 將 Array 的元素轉換為字符串。結果字符串由逗號分隔,且連接起來。
Boolean 如果 Boolean 值是 true,則返回 “true”。否則,返回 “false”。
Date 返回日期的文字表示法。
Error 返回一個包含相關錯誤信息的字符串。
Function 返回如下格式的字符串,其中 functionname 是被調用 toString 方法函數的名稱:function functionname( ) { [native code] }
Number 返回數字的文字表示。
String 返回 String 對象的值。
默認 返回 “[object objectname]”,其中 objectname 是對象類型的名稱。
  • 5、String(mix)函數,將任何類型的值轉換為字符串,其規則為:

    (1)如果有toString()方法,則調用該方法(不傳遞radix參數)並返回結果
    (2)如果是null,返回”null”
    (3)如果是undefined,返回”undefined”
  • 6、Boolean(mix)函數,將任何類型的值轉換為布爾值。
    以下值會被轉換為false:false、”"、0、NaN、null、undefined,其余任何值都會被轉換為true。

隱式轉換

在某些情況下,即使我們不提供顯示轉換,Javascript也會進行自動類型轉換,主要情況有:

  • 1、 用於檢測是否為非數值的函數:isNaN(mix)

        isNaN()函數,經測試發現,該函數會嘗試將參數值用Number()進行轉換,如果結果為“非數值”則返回true,否則返回false。
  • 2、遞增遞減操作符(包括前置和后置)、一元正負符號操作符

        這些操作符適用於任何數據類型的值,針對不同類型的值,該操作符遵循以下規則(經過對比發現,其規則與Number()規則基本相同):
        (1)如果是包含有效數字字符的字符串,先將其轉換為數字值(轉換規則同Number()),在執行加減1的操作,字符串變量變為數值變量。
        (2)如果是不包含有效數字字符的字符串,將變量的值設置為NaN,字符串變量變成數值變量。
        (3)如果是布爾值false,先將其轉換為0再執行加減1的操作,布爾值變量編程數值變量。
        (4)如果是布爾值true,先將其轉換為1再執行加減1的操作,布爾值變量變成數值變量。
        (5)如果是浮點數值,執行加減1的操作。
        (6)如果是對象,先調用對象的valueOf()方法,然后對該返回值應用前面的規則。如果結果是NaN,則調用toString()方法后再應用前面的規則。對象變量變成數值變量。

    小測驗:
    分別對以下類型的值執行后置遞增操作,結果是什么?
    “2″, ”02dd”, ”", false, 22.5, +”", -false, +new Date()

  • 3、 加法運算操作符
    加號運算操作符在Javascript也用於字符串連接符,所以加號操作符的規則分兩種情況:
    如果兩個操作值都是數值,其規則為:
    (1)如果一個操作數為NaN,則結果為NaN
    (2)如果是Infinity+Infinity,結果是Infinity
    (3)如果是-Infinity+(-Infinity),結果是-Infinity
    (4)如果是Infinity+(-Infinity),結果是NaN
    (5)如果是+0+(+0),結果為+0
    (6)如果是(-0)+(-0),結果為-0
    (7)如果是(+0)+(-0),結果為+0
    如果有一個操作值為字符串,則:
    如果兩個操作值都是字符串,則將它們拼接起來
    如果只有一個操作值為字符串,則將另外操作值轉換為字符串,然后拼接起來
    如果一個操作數是對象、數值或者布爾值,則調用toString()方法取得字符串值,然后再應用前面的字符串規則。對於undefined和null,分別調用String()顯式轉換為字符串。
    可以看出,加法運算中,如果有一個操作值為字符串類型,則將另一個操作值轉換為字符串,最后連接起來。

  • 4、 乘除、減號運算符、取模運算符
    這些操作符針對的是運算,所以他們具有共同性:如果操作值之一不是數值,則被隱式調用Number()函數進行轉換。具體每一種運算的詳細規則請參考ECMAScript中的定義。

  • 5、 邏輯操作符(!、&&、||)
    邏輯非(!)操作符首先通過Boolean()函數將它的操作值轉換為布爾值,然后求反。
    一、邏輯與(&&)操作符,如果一個操作值不是布爾值時,遵循以下規則進行轉換:
    (1)如果第一個操作數經Boolean()轉換后為true,則返回第二個操作值,否則返回第一個值(不是Boolean()轉換后的值)
    (2)如果有一個操作值為null,返回null
    (3)如果有一個操作值為NaN,返回NaN
    (4)如果有一個操作值為undefined,返回undefined
    邏輯或(||)操作符,如果一個操作值不是布爾值,遵循以下規則:
    (1)如果第一個操作值經Boolean()轉換后為false,則返回第二個操作值,否則返回第一個操作值(不是Boolean()轉換后的值)
    (2)對於undefined、null和NaN的處理規則與邏輯與(&&)相同

  • 6、 關系操作符(<, >, <=, >=)
    與上述操作符一樣,關系操作符的操作值也可以是任意類型的,所以使用非數值類型參與比較時也需要系統進行隱式類型轉換:
    (1)如果兩個操作值都是數值,則進行數值比較
    (2)如果兩個操作值都是字符串,則比較字符串對應的字符編碼值
    (3)如果只有一個操作值是數值,則將另一個操作值轉換為數值,進行數值比較
    (4)如果一個操作數是對象,則調用valueOf()方法(如果對象沒有valueOf()方法則調用toString()方法),得到的結果按照前面的規則執行比較
    (5)如果一個操作值是布爾值,則將其轉換為數值,再進行比較
    注:NaN是非常特殊的值,它不和任何類型的值相等,包括它自己,同時它與任何類型的值比較大小時都返回false。

  • 7、 相等操作符(==)
    相等操作符會對操作值進行隱式轉換后進行比較:
    (1)如果一個操作值為布爾值,則在比較之前先將其轉換為數值
    (2)如果一個操作值為字符串,另一個操作值為數值,則通過Number()函數將字符串轉換為數值
    (3)如果一個操作值是對象,另一個不是,則調用對象的valueOf()方法,得到的結果按照前面的規則進行比較
    (4)null與undefined是相等的
    (5)如果一個操作值為NaN,則相等比較返回false
    (6)如果兩個操作值都是對象,則比較它們是不是指向同一個對象

 

 

 

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM