Javascript類型轉換的規則

來源:互聯網
上載者:User

Javascript的變數是鬆散類型的,它可以儲存Javascript支援的任何資料類型,其變數的類型可以在運行時被動態改變。請看樣本:

var n = 10;n = "hello CSSer!";n = {};

上面的樣本中,首先聲明n變數並初始化其值為10(整數類型),接著將字串“hello CSSer!”賦值給n,接著再賦一個對象給它,最後n的類型是物件類型。可以看出變數n的類型具有動態性,實際編程中,我們建議不要頻繁改變變數的類型,因為這對調試沒有好處。

正因為Javascript中變數類型具有動態性,在程式實際執行的過程中就需要用到類型轉換的概念。類型轉換可以分為隱式轉換和顯式轉換,所謂隱
式轉換即程式在運行時進行的自動轉換,顯式轉換則是人為的對類型進行強制轉換。本文將對Javascript的類型轉換進行總結。

顯式轉換

通過手動進行類型轉換,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. 如果是Null 字元串,將其轉換為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. 忽略字串前面的空格,直至找到第一個非Null 字元
  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
  • 如果有一個操作值為字串,則:
  1. 如果兩個操作值都是字串,則將它們拼接起來
  2. 如果只有一個操作值為字串,則將另外操作值轉換為字串,然後拼接起來
  3. 如果一個運算元是對象、數值或者布爾值,則調用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. 如果兩個操作值都是對象,則比較它們是不是指向同一個對象
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.