最新的ECMAScript中定義了7種數據類型JavaScript 數據類型和數據結構 :瀏覽器
6種原始類型:Boolean、Null、Undefined、Number、String、Symbol (ECMAScript 6 新定義),和Object。安全
至於平時常常使用的Array、Function、Date...都是Object類型(其實我以爲全部類型都是Object類型)數據結構
使用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類型沒法判斷
複製代碼
原理:實例對象上的__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方法進行轉換,瀏覽器自行轉換都基於此方法。spa
只要遇到一個非有效數字字符,結果就是NaN。‘’ -> 0, 空字符串都爲0
。true -> 1, false -> 0
。null -> 0,undefined -> NaN
。先都轉換爲字符串(toString), 而後再轉換爲數字(Number)
。調用方法toString進行轉換code
1->'1', NaN->'NaN', []->'', [2,3]->'2,3'
。{}->"[object Object]"
只有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 == NaN:false
NaN和誰都不相等
複製代碼
參考:js中數據類型轉換總彙