js中的數據類型

定義

最新的ECMAScript中定義了7種數據類型Java​Script 數據類型和數據結構 瀏覽器

6種原始類型:Boolean、Null、Undefined、Number、String、Symbol (ECMAScript 6 新定義),和Object。安全

至於平時常常使用的Array、Function、Date...都是Object類型(其實我以爲全部類型都是Object類型)數據結構

類型判斷

1.typeof判斷

使用typeof判斷數據類型,只能判斷出原始數據類型和Object,其中原始類型的null還會被判斷爲Object,另外對象類型下的其餘子類型除function外也都會被斷定爲Object。ide

//能夠判斷的類型
typeof null //"object"
typeof undefined //"undefined"
typeof 123 //"number"
typeof '2222' //"string"
typeof true //"boolean"
typeof Symbol(22) //"symbol"
typeof {} //"object"
typeof function a(){} //"function"

//判斷不了具體的object類型
typeof  [2,3,4] //"object" Array類型沒法判斷
typeof new Date() //"object" Date類型沒法判斷
複製代碼

2.原型判斷方法

原理:實例對象上的__proto__屬性指向構造函數的原型,構造函原型上的constructor屬性指向構造函數自己,在構造函數自己上有個name屬性,能夠告訴咱們構造函數叫啥,因此咱們能夠利用這點進行判斷。可是undefind和null並不能用此方法判斷會報錯。函數

function testType(value){
    return value.constructor.name //能夠直接訪問到原型上的方法
}

testType(null) //報錯!null並無__proto__屬性,畢竟它本質不是個對象,undefined和null相同就不列舉了

testType(666) //"Number"

testType(true) //"Boolean"

testType(new Date()) //"Date"

testType([2,3,4,5]) //"Array"

testType('wwww') //"String"

testType(/8*/) //"RegExp"

複製代碼

原型鏈的方法缺點是constructor屬性能夠修改,也不安全。ui

類型轉換

Number類型轉換

轉換場景

  • isNaN檢測的時候,檢測的值不是數字類型,瀏覽器會本身調用Number方法把它先轉換爲數字,再檢測是否爲非有效數字。
  • 基於parseInt/parseFloat/Number去手動轉換爲數字類型。
  • 數學運算:+、-、*、/、%(‘+’不只是數學運算符,多是字符串拼接)。
  • 在基於‘==’比較時,有時候也會把其餘轉換成數字類型

轉換規律

使用Number方法進行轉換,瀏覽器自行轉換都基於此方法。spa

  • 字符串轉換爲數字:只要遇到一個非有效數字字符,結果就是NaN。‘’ -> 0, 空字符串都爲0
  • 把布爾轉換爲數字:true -> 1, false -> 0
  • 把沒有轉換爲數字:null -> 0,undefined -> NaN
  • 把引用類型值轉換爲數字:先都轉換爲字符串(toString), 而後再轉換爲數字(Number)

String類型轉換

轉換場景

  • 基於alert/confirm等方法輸出內容的時候,會把輸出值轉換爲字符串,再輸出。
  • 基於'+'進行字符串拼接的時候。
  • 把引用類型轉換爲數字的時候。
  • 給對象設置屬性名。若是不是字符串,先轉化爲字符串,而後再看成屬性儲存到對象中(對象的屬性只能是數字或者字符串)。
  • 手動調用toString/join/String等方法的時候。

轉換規律

調用方法toString進行轉換code

  • 除了對象,都是你們理解的結果:1->'1', NaN->'NaN', []->'', [2,3]->'2,3'
  • 對象都是"[object Object]":{}->"[object Object]"

Boolean類型轉換

轉換場景

  • 基於!/Boolean等方法轉換
  • 條件判斷中的條件最後都會轉換爲布爾類型

轉換規律

只有0/NaN/‘’/null/undefined五個值轉換爲false,其他都是轉換爲true。regexp

特殊狀況:數學運算和字符串拼接‘+’

當表達式中出現字符串,就是字符串拼接,不然就是數學運算對象

1 + true // 2
'1' + true //'1true'

[12] + 10 //'1210' 引用類型轉換爲數字,會先轉換爲字符串,因此變成了字符串拼接
({}) + 10 //"[object Object]10"
[] + 10 // '10'

{} + 10 //10 它不是數學運算,也不是字符串拼接,它是兩部分代碼:{}; + 10
複製代碼

特殊狀況:‘==’左右兩邊數據類型不同,先轉換爲相同類型,再進行比較

  • 對象 == 對象:地址相同才相等
  • 對象 == 數字:把對象轉換爲數字
  • 對象 == 布爾:都轉換爲數字
  • 對象 == 字符串:都轉換爲數字
  • 字符串 == 數字:把字符串轉換爲數字
  • 字符串 == 布爾:都轉換爲數字
  • 布爾 == 數字:把布爾轉換爲數字

總結:不一樣狀況的比較,都是把其它值轉換爲數字,再進行比較。

  • 特殊:
null == undefined //true
null === undefined //false
null&&undefined //和其餘都不相等

NaN == NaNfalse
NaN和誰都不相等
複製代碼

參考:js中數據類型轉換總彙

相關文章
相關標籤/搜索