基本數據類型 number string boolean underfined null; 引用數據類型 Object Array RegExp; typeof 檢測數據類型 但是不能檢測(對象、數組、正則) instanceof/constructor檢測某一個實例是否屬於一個類; 我們的cons ...
基本數據類型
number string boolean underfined null;
引用數據類型
Object Array RegExp;
typeof 檢測數據類型 但是不能檢測(對象、數組、正則)
instanceof/constructor檢測某一個實例是否屬於一個類;
我們的constructor可以避免instanceof檢測的時候,用Object也是true的問題;
console.log([].constructor === Object);//->false
局限性:
1、用instanceof檢測的時候,只要當前的這個類在實例的原型鏈上(可以通過原型鏈__proto__找到它),檢測出來的結果都是true
2、基本數據類型不能用instanceof來檢測;
對於對象數據類型,兩種方式創建出來的都是所屬類的一個實例,而且都是對象數據類型的值,是沒有區別的,
var ary =[]; var ary = new Array;
對於基本數據類型來說,不管哪種方式創建出來的都是所屬類的一個實例,但字面量創建出來的是基本數據類型,實例創建的是對象數據類型
var num =1; var num2 = new Number("1"); console.log(typeof num1,typeof num2);//->"number" "object"
3、在類的原型繼承中,instanceof檢測出來的結果其實是不准確的
function Fn(){ } ; Fn.prototype = new Array; var f = new Fn; console.log(f instanceof Array)-> true;
雖然Fn繼承了Array,但是f沒有length和數字索引那些東西,所以f應該不是數組才對,但是instance檢測結果是true,以為f雖然不是數組,但是在f的原型鏈上可以找到Array;
Object.prototype.toString.call(value)
1)找到Object原型上的toString方法,讓方法執行,並且讓方法中的this變為value(value->就是我們要檢測數據類型的值);
->toString:一個方法,轉換為字元串數據類型用的方法
每一個數據類型所屬類的原型上都有toString方法,例如:Number.prototype/String.prototype/Array.prototype/Function.prototype...
除了Object上的toString,其他類原型上的toString都是把當前的數據值轉換為字元串的意思
->null和undefined比較的特殊:他們所屬類Null/Undefined的原型上也有toString,只不過不讓我們用而已,不僅如此其實類的原型都給屏蔽了;
->HTML元素對象的toString:雖然它的原型鏈很長,但是在其它類的原型上都沒有toString,只有在最底層Object.prototype這上才有;
var oDiv = document.getElementById("div1"); oDiv.toString();調用的其實也是Object.prototype.toString...
->alert、document.write這兩種輸出的方式其實都是把要輸出的內容先轉換為字元串,然後在輸出的
alert([]);//->"" alert(true);//->"true" alert({})->這個就要調用Object.prototype上的toString了
Object.prototype.toString是用來返回對應值的所屬類信息的
var oDiv = document.getElementById("div1"); var obj = {}; oDiv.toString();//->"[object HTMLDivElement]" obj.toString();//->"[object Object]"
原理:
->obj首先找到原型上toString方法,並且讓toString執行,toString方法執行的時候,裡面的this是obj,
同理oDiv.toString(),toString方法中的this是oDiv
->執行toString方法,返回當前方法中this的數據類型 ->"[object 當前this的直屬類]",
例如:"[object HTMLDivElement]"/"[object Object]"
Object.prototype.toString.call(12);->執行原型上的toString,並且讓方法中的this變為12,也就相當於返回的是12的直屬類的信息 ->"[object Number]"
Object.prototype.toString.call("hjj");//->"[object String]"
依此類推:
"[object Boolean]"/"[object Null]"/"[object Undefined]"/"[object Object]"/"[object Array]"/"[object RegExp]"/"[object Function]"/"[object Math]"/"[object Date]"...
->所有的數據類型都可以用它來檢測,而且非常的精準;