隱式類型轉換

1、抽象值操做

在javascript中隱式類型轉換老是返回基本類型值,如字符串、數字、布爾值,不會返回對象或者函數。因此咱們在介紹隱式類型轉換以前首先來看一看字符串、數字、布爾值之間類型轉換的基本規則。這裏涉及到ToStringToNumberToBoolean,同時咱們還會介紹ToPrimitivejavascript

(一)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

  1. null轉化爲false
Boolean(null)  // false
複製代碼
  1. undefined轉化爲false
Boolean(undefined)  // false
複製代碼
  1. 除""之外,全部字符串轉化爲true
Boolean("")  // fasle
Boolean("abc")  // true
Boolean('0')  // true
複製代碼
  1. 除0(包括+0和-0)和NaN外,全部數字轉化爲true
Boolean(0)  // false
Boolean(NaN)  // false
Boolean(-9)  // true
複製代碼
  1. 全部對象轉化爲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
複製代碼

2、隱式類型轉化

(一)字符串和數字之間的隱式類型轉化

(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
複製代碼

(三)隱式類型轉化爲布爾值

如下幾種狀況會發生隱式類型轉化爲布爾值

  1. if(..)條件判斷語句
  2. for()中的條件判斷
  3. while()do..while(..)中的條件判斷
  4. ? : 三目運算符中的條件判斷
  5. 邏輯運算符 ||&& 左邊的操做數

(四)|| 和 &&

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就返回第一個操做數的值。

本篇就介紹到這裏,下篇介紹隱式類型轉換之=====(寬鬆相等和嚴格相等)。

相關文章
相關標籤/搜索