在javascript中隱式類型轉換老是返回基本類型值,如字符串、數字、布爾值,不會返回對象或者函數。因此咱們在介紹隱式類型轉換以前首先來看一看字符串、數字、布爾值之間類型轉換的基本規則。這裏涉及到ToString
、ToNumber
和ToBoolean
,同時咱們還會介紹ToPrimitive
。javascript
ToString
ToString
負責處理非字符串到字符串的強制類型轉換。java
(1)基本類型的值轉化爲字符串的基本規則:數組
1. null轉化爲"null"
2. undefined轉化爲"undefined"
3. true轉化爲"true"
4. 數字的字符串轉化規則遵循通用規則,不過那些極小或者極大的數值使用指數形式:
var a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000
a.toString() // "1.07e21"
複製代碼
(2)對於普通對象來講,若是沒有自定義toString()
方法,返回"[object Object]"
。若是有本身的toString()
方法就會調用該方法並返回值。bash
(3)數組的toString()
返回全部單元字符串化之後再用","鏈接起來:函數
var a = [1,2,3]
a.toString() // "1,2,3"
複製代碼
(4)日期、正則、函數也遵循通用規則。spa
ToNumber
(1)基本類型的值轉化爲數字的基本規則:code
1. null轉化爲0
2. undefined轉化爲NaN
3. true轉化爲1,false轉化爲0
4. 字符串的處理遵循通用規則
Number("23") // 23
Number("") // 0
複製代碼
(2)對象或者數組首先會被轉化爲相應的基本類型,若是返回的是非數字的基本類型,再按照以上規則進行轉化。其中對象轉化爲基本類型的時候會使用ToPrimitive
操做。對象
ToPrimitive
ToPrimitive
操做會首先檢查對象是否有valueOf()
方法,若是有而且返回基本類型的值,就調用該方法進行類型轉化。若是沒有就使用toString()
返回的值。ip
若是valueOf()
和toString()
均不返回基本類型的值,就會產生TypeError
錯誤。字符串
若是不對對象和數組的valueOf()
和toString()
方法進行重寫,那麼:
(1)對象的valueOf()
返回對象自己,toString()
返回"[object Object]"
(2)數組的valueOf()
返回數組自己,toString()
返回全部單元字符串化之後再用","鏈接起來。
var a = {
name: 'sillywa'
}
var b = [1,2,3]
a.valueOf() // { name: 'sillywa' }
a.toString() // "[object Object]"
b.valueOf() // [1,2,3]
b.toString() // "1,2,3"
複製代碼
ToBoolean
null
轉化爲false
Boolean(null) // false
複製代碼
undefined
轉化爲false
Boolean(undefined) // false
複製代碼
true
Boolean("") // fasle
Boolean("abc") // true
Boolean('0') // true
複製代碼
NaN
外,全部數字轉化爲true
Boolean(0) // false
Boolean(NaN) // false
Boolean(-9) // true
複製代碼
true
Boolean({}) // true
Boolean([]) // true
// 須要注意的是經過new關鍵字獲得的是一個對象
var a = new Boolean(false)
var b = new Number(0)
var c = new String('')
var d = Boolean(a && b && c)
d // true
複製代碼
(1)數字轉化爲字符串
+運算符既能用於數字相加,也能用於字符串拼接。那麼javascript是怎麼判斷咱們要執行那個操做的呢?例如:
var a = '42'
var b = '0'
var c = 42
var d = 0
var e = 42
var f = '0'
a + b // "420"
c + d // 42
e + f // "420"
複製代碼
以上代碼不難理解,一般咱們認爲+運算符兩邊只要有一個操做數是字符串就會執行字符串的拼接操做,可是實際狀況更爲複雜,例如:
var a = [1,2]
var b = [3,4]
a + b // "1,23,4"
複製代碼
a,b
都不是字符串,可是它們都被轉化爲字符串進行拼接操做,緣由何在?
簡單的理解應當是若是+運算符其中一個是字符串或者能夠經過ToPrimitive
(針對於對象,包括數組)轉化爲字符串,則執行字符串的拼接;不然執行數字相加。
須要注意的是若是是 + '42'
表明強制類型轉化爲數字,即 42
。
(2)字符串轉化爲數字
- , * , /均可以用來將字符串轉化爲數字,其規則與+相似
var a = '3.14'
var b = a - 0
b // 3.14
複製代碼
一樣對於對象和數組也是同樣
var a = [2]
var b = [1]
a - b // 1
複製代碼
爲了執行減法運算,a、b
都須要被轉化爲數字,首先經過ToPrimitive
轉化爲字符串再轉化爲數字。
簡單舉了例子:
1 + false // 1
1+ true // 2
複製代碼
如下幾種狀況會發生隱式類型轉化爲布爾值
if(..)
條件判斷語句for()
中的條件判斷while()
和do..while(..)
中的條件判斷? :
三目運算符中的條件判斷||
和&&
左邊的操做數|| 和 &&
ES5規範中有以下描述
&&
和 ||
運算符並不必定返回布爾值,而是兩個操做數其中一個的值
例如:
var a = 42
var b = 'abc'
var c = null
a || b // 42
a && b // 'abc'
c || b // 'abc'
c && b // null
複製代碼
|| 和 &&
首先會對第一個操做數進行條件判斷,若是其不是布爾值,會被轉化爲布爾值,在進行判斷。
對於 ||
若是第一個操做數返回true則返回第一個操做數的值,若是第一個操做數返回false就返回第二個操做數的值。
對於 &&
若是第一個操做數返回true則返回第二個操做數的值,若是第一個操做數返回false就返回第一個操做數的值。
本篇就介紹到這裏,下篇介紹隱式類型轉換之==
和===
(寬鬆相等和嚴格相等)。