JavaScript 是一種弱類型或者說動態語言。這意味着你不用提早聲明變量的類型,在程序運行過程當中,類型會被自動肯定。這也意味着你能夠使用同一個變量保存不一樣類型的數據,本文主要介紹有關數據類型的轉換函數
指的是主動調用函數實現數據類型的轉換,隱式轉換主要是基於如下三種方式進行:
Number(666) // 666
Number('123') // 123 Number('') // 0 Number('123sd') // NaN
Number(true) // 1 Number(false) // 0
Number(null) // 0
Number(undefined) // NaN
- 第一步先調用對象的valueOf方法,若是返回值爲基本類型則不執行第二步
- 第二部調用對象的toString方法,若是返回值爲符合類型則報錯
var a = {a: 1} Number(a) // NaN /** 內部執行流程 **/ var tmp1 = a.valeOf() // {a: 1} var tmp2 = tmp.toString() // "[object Object]" Number(tmp2) // NaN
String(123) // '123'
String('123') // '123'
String(true) // 'true' String(false) // 'false'
String(null) // 'null'
String(undefined) // 'undefined'
- 第一步先調toString方法,若是返回值不是基礎類型執行第二步
- 第二步調用valueOf方法,若是返回值不是基礎類型,報錯
var a = {a: 1} String(a) // '[object Object]'
驗證工做原理
a.toString = function () { return 'hi' } String(a) // 'hi' a.toString = function () { return [] } a.valueOf = function () { return 'hello world' } String(a) // 'hello world' a.valueOf = function () { return {b: 1} } String(a) // 報錯 Error: Uncaught TypeError: Cannot convert object to primitive value at String (<anonymous>) at <anonymous>:10:1
Boolean(+0) Boolean(-0) Boolean(NaN) Boolean('') Boolean(false) Boolean(undefined) Boolean(null) // 都爲false其他都爲true
隱式轉換的基石就是js引擎自動調用顯示類型轉換的方法,在如下三種狀況下發生:
+ 轉String類型
1 + 'asd123' // '1asd123'
- * / 轉Number類型
1 - 'asd123' // NaN 1 / 'asd123' // NaN 1 * 'asd123' // NaN
轉Boolean類型
1 - 'asd' || true // true if ( 1 - 'asd') { ... } // false
按上述規則進行隱式轉換
console.log(1-'asd123') // NaN console.log(1 + 'asd123') // '1asd123' ...