ECMAscript 中規定的數據類型有:
1.簡單類型:String、Number、Boolean、Undefined、Null、Symbol
2.引用(復雜)類型:Object
檢測這些數據的類型的方法有:
第一種:typeof 可以檢測一些基本的數據類型
語法:typeof 后面加不加括號都是可以用的
注意:正則、{}、[]、null輸出結果為object
所以這個方法並不是很好
例子:
console.log(typeof /\d/);//object console.log(typeof {});//object console.log(typeof []);//object console.log(typeof (null));//object console.log(typeof 123);//number console.log(typeof true);//boolean console.log(typeof function () {});//function console.log(typeof (undefined));//undefined
第七種:valueOf
可以看到數據最本質內容(原始值)
例子:
1 let x = "12345"; 2 let s = new String('12345'); 3 console.log(typeof x);//string 4 console.log(typeof s);//object 5 console.log(x == s);//true (typeof檢測出來是對象居然和一個數組相等,顯然s並不是一個真的對象。) 6 //此時看看 valueOf()的表現 7 console.log(s.valueOf());//12345 拿到s的原始值是 字符串的12345 8 console.log(typeof s.valueOf())//string 這才是 s 的真正的數據類型
第二種:instanceof 檢測當前實例是否隸屬於某各類。
雙目運算符 a instanceof b ,判斷a的構造器是否為b,返回值為布爾值
例子:
1 function fn() {} 2 let f = new fn; 3 console.log(f instanceof fn);//true 4 console.log(f instanceof Object);//true 5 let arr = [1,2,3,4]; 6 console.log(arr instanceof Array);//true
第三種:constructor 構造函數
語法:實例.constructor
對象的原型鏈下(===構造函數的原型下)有一個屬性,叫constructor
缺點:constructor並不可靠,容易被修改(只有參考價值)。即使被修改了,也不會影響代碼的正常運行。
正常開發的時候,constructor不小心被修改了,為了方便維護,和開發,可以手動更正constructor的指向。
例子:
1 function fn() {} 2 let f = new fn; 3 console.log(f.constructor.name);//fn 4 console.log(fn.constructor);//Function(){} 5 console.log(Function.constructor);//Function(){}
第四種:hasOwnporperty 檢測當前屬性是否為對象的私有屬性
語法: obj.hasOwnporperty("屬性名(K值)")
例子:
let obj = { name:"xx" }; console.log(obj.hasOwnProperty('name'));//true console.log(obj.hasOwnProperty('xxxx'));//false
第五種:isArray 判斷是否為數組、 isNaN() 判斷是否是NaN
例子:
console.log(Array.isArray([]));//true console.log(Array.isArray(new Array()));//true
console.log(isNaN(NaN)) // true
console.log(isNaN(+"12ab")) //true
第六種:Object.portotype.toString (最好的)
語法:Object.prototype.toString.call([value])
獲取Object.portotype上的toString方法,讓方法的this變為需要檢測的數據類型值,並且讓這個方法執行
在Number、String、Boolean、Array、Function、RegExp...這些類的原型上都有一個toString方法:這個方法就是把本身的值轉化為字符串
(12).toString()//'12' (true).toString()//'true' [12,23].toString()//'12.23'
...
在Object這個類的原型上也有一個方法toString,但是這個方法並不是把值轉換成字符串,而是`返回當前值得所屬類詳細信息,固定結構:'[object 所屬的類]'`
1 var obj ={name:'珠穆朗瑪峰'} 2 obj.toString()//[object Object]
調取的正是Object.prototype.toString方法
obj.toString()
首先執行Object.prototype.tostring方法
這個方法中的this就是我們操作的數據值obj
=>總結:Object.prototype.toString執行的時候返回當前方法中的this的所屬類信息
也就是,我想知道誰的所屬類信息,我們就把這個toString方法執行,並且讓this變為我們檢測的這個數據值,那么方法返回的結果就是當前檢測這個值得所屬類信息
Object.prototype.toString()
({}).toString.call([value])
Object.prototype.toString.call(12)//[boject Number] Object.prototype.toString.call(true)//[boject Boolean]
......
"[object Number]"
"[object String]"
"[object Object]"
"[object Function]"
"[object Undefined]"
"[object Null]"
"[object RegExp]"
"[object Boolean]"
使用toString檢測數據類型,不管你是啥值,我們都可以正常檢測出需要的結果(這個方法檢測是`萬能`的)
話外:
1.Math是個對象,不是類。類才有prototype(原型)。`也就是說類都有原型:prototype,對象都有原型鏈:__proto__,函數既是類,也是對象,也是函數。`
2.如何把對象轉換成字符串?
對象下的toString方法是檢測數據類型的,而不是用來轉化成字符串的,這時可以用JSON的方法來轉化
1 let obj={name:'朱軍林'} 2 obj.toString()//=>"[object Object]" 3 4 5 JSON.stringify({name:'朱軍林'}) 6 "{"name":"朱軍林"}"
