JS-類型轉換

類型轉換

  • 原始值轉對象很簡單,原始值通過調用String(),Number(),Boolean()構造函數,轉換為他們各自的包裝對象。nullundefined屬於例外,當將他們用在期望是一個對象的地方都會造成一個類型錯誤(TypeErroe)異常,而不會執行正常的轉換。

  • 對象轉換相對複雜,下面具體描述

    1、轉換和相等性

    由於JS可以做靈活的類型轉換,因此其'=='相等運算符也隨相等的含義靈活多變。例如:

  • 一個值轉換為另一個值並不意味著兩個值相等。比如,如果在期望使用布爾值的地方使用了undefined,它將會轉換為false,但這並不表明undefined==false。JS運算符和語句期望使用多樣化的數據類型,並可以相互轉換。if語句將undefined轉換為false,但==運算符從不試圖將其操作數轉換為布爾值。

    Advertisements

  • 如果兩個操作數的類型相同,則根據值進行比較,也就是類似於嚴格相等(===)進行比較。

  • 如果兩個操作數類型不同,==相等操作符也可能會認為他們相等。檢測相等將會遵守如下規則和類型轉換:

  • 1、如果一個值是null,另一個是undefined,則它們相等。

    2、如果一個值是數字,另一個是字元串,先將字元串轉換為數字,然後使用轉換后的值進行比較。

    3、如果其中一個值是true,則將其轉為1再進行比較。如果其中一個值是false,則將其轉換為0再進行比較。

    4、如果一個值是對象,另一個值是數字或字元串,則將對象轉為原始值,然後再進行比較。對象通過toString()方法或者valueOf()方法轉換為原始值。JS語言核心的內置首先嘗試使用valueOf(),再嘗試使用toString(),除了日期類,日期類只是用toString()轉換。那些不是JS語言核心中的對象則通過各自的實現中定義的方法轉換為原始值。

    Advertisements

    5、其他不同類型之間的比較均不相等。

    2、顯示類型轉換

  • 做顯示類型轉換最簡單的方法就是使用Boolean()、Number()、String()或Object()函數。當不通過new運算符調用這些函數時,它們會作為類型轉換函數:

  • ==需要注意的是,除了null或undefined之外的任何值都具有toString()方法,這個方法執行結果通常和String()方法的返回結果一致。==

  • JS中某些運算符會做隱式的類型轉換,又是用戶類型轉換。

Number類定義的toString()方法可以接收表示轉換基數(radix)的可選參數,如果不指定此參數,轉換規則將是基於十進位。

如果通過Number()轉換函數傳入一個字元串,它會試圖將其轉化為一個整數或浮點數直接量,這個方法只能基於十進位數進行轉換,並且不能出現非法的尾隨字元。parseInt()函數和parseFloat()函數(它們是全局函數,不從屬於任何類的方法)更加靈活。parseInt()可以接收第二個可選參數,這個參數指定數字轉換的基數,合法的取值範圍是2-36。

  • 3、對象轉換為原始值

  • 對象到布爾值的轉換非常簡單:所有對象(包括數組和函數)都轉換為true。對於包裝對象亦是如此:newBoolean(false)是一個對象而不是原始值,它江轉換為true。

  • 對象到字元串和對象到數字的轉換都是通過調用帶轉換對象的一個方法來完成的。JS對象有兩個不同的方法來執行轉換:toString()和valueOf()

    toString():它的作用是返回一個反應這個對象的字元串。默認的toString()方法並不會返回一個有趣的值。

    ({x:1}).toString() >> "[object Object]"

    很多類定義了更多特定版本的toString()方法。例如,數組類的toString()方法將每個數組元素轉換為一個字元串,並在元素之間添加逗號后合併成結果字元串。函數類的toString()方法返回這個函數的實現定義表示方式。日期類定義的toString()方法返回了一個可讀的日期和時間字元串。RegExp類定義的toString()方法將RegExp對象轉換為表示正則表達式直接量的字元串。

  • valueOf():如果存在任意原始值,它就默認將對象轉換為表示它的原始值。對象是複合值,而且大多數對象無法真正表示為一個原始值,因此默認valueOf()方法簡單地返回對象本身,而不是返回一個原始值。數組、函數和正則表達式簡單地繼承了這個默認方法,調用這些類型的實例的valueOf()方法只是簡單返回對象本身。日期則返回對應毫秒數。

    3..1、JS中對象到字元串的轉換經過了如下這些步驟:

  • 如果對象具有toString()方法,則調用這個方法。如果他返回一個原始值,JS將這個原始值轉換為字元串,並返回這個字元串結果。

  • 如果對象沒有toString()方法,或這個方法並不返回一個原始值,那麼JS會調用valueOf()方法。如果存在這個方法,則JS調用它。如果返回值是原始值,JS將這個值轉換為字元串,並返回這個字元串結果。

  • 否則,JS無法從toString()或valueOf()獲得一個原始值,因此這時它將拋出一個類型錯誤異常。

    3.2、在對象到數字的轉換過程中,JS做了同樣的事情,只是它會首先嘗試使用valueOf()方法:

  • 如果對象具有valueOf()方法,後者返回一個原始值,則JS將這個原始值轉換為數字返回

  • 否則,如果對象具有toString()方法,返回一個原始值,則JS將其轉換並返回

  • 否則,JS拋出一個類型異常錯誤。

Advertisements

你可能會喜歡