数据类型及数据类型的检测

 

基本数据类型

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

 

 

posted @ 2016-03-31 23:12  LeBron_J  阅读(373)  评论(0编辑  收藏  举报