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

顯式轉換

經過手動進行類型轉換,Javascript提供瞭如下轉型函數:編程

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

    (1)若是是布爾值,true和false分別被轉換爲1和0
      (2)若是是數字值,返回自己。
      (3)若是是null,返回0.
      (4)若是是undefined,返回NaN。
      (5)若是是字符串,遵循如下規則:
              一、若是字符串中只包含數字,則將其轉換爲十進制(忽略前導0)
              二、若是字符串中包含有效的浮點格式,將其轉換爲浮點數值(忽略前導0)
              三、若是是空字符串,將其轉換爲0
              四、若是字符串中包含非以上格式,則將其轉換爲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);編碼

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

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

    小測驗:
    parseInt(「hello CSSer!」);
    Number(「0×8″);
    parseInt(「」);
    parseInt(「020dd」);
    parseInt(「070″);
    parseInt(「22.5″);對象

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

    它的規則與parseInt基本相同,但也有點區別:字符串中第一個小數點符號是有效的,另外parseFloat會忽略全部前導0,若是字符串包含一個可解析爲整數的數,則返回整數值而不是浮點數值。
  • 四、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 是對象類型的名稱。
  • 五、String(mix)函數,將任何類型的值轉換爲字符串,其規則爲:string

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

隱式轉換

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

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

    isNaN()函數,經測試發現,該函數會嘗試將參數值用Number()進行轉換,若是結果爲「非數值」則返回true,不然返回false。
  • 二、遞增遞減操做符(包括前置和後置)、一元正負符號操做符

    這些操做符適用於任何數據類型的值,針對不一樣類型的值,該操做符遵循如下規則(通過對比發現,其規則與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()

  • 三、 加法運算操做符
    加號運算操做符在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()顯式轉換爲字符串。
    能夠看出,加法運算中,若是有一個操做值爲字符串類型,則將另外一個操做值轉換爲字符串,最後鏈接起來。

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

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

  • 六、 關係操做符(<, >, <=, >=)
    與上述操做符同樣,關係操做符的操做值也能夠是任意類型的,因此使用非數值類型參與比較時也須要系統進行隱式類型轉換:
    (1)若是兩個操做值都是數值,則進行數值比較
    (2)若是兩個操做值都是字符串,則比較字符串對應的字符編碼值
    (3)若是隻有一個操做值是數值,則將另外一個操做值轉換爲數值,進行數值比較
    (4)若是一個操做數是對象,則調用valueOf()方法(若是對象沒有valueOf()方法則調用toString()方法),獲得的結果按照前面的規則執行比較
    (5)若是一個操做值是布爾值,則將其轉換爲數值,再進行比較
    注:NaN是很是特殊的值,它不和任何類型的值相等,包括它本身,同時它與任何類型的值比較大小時都返回false。

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

相關文章
相關標籤/搜索