基本数据类型
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]"...
->所有的数据类型都可以用它来检测,而且非常的精准;