判断js数据类型的四种⽅法,以及各⾃的优缺点(很详细哦)⾸先我们简单的说⼀下js中的⼏种数据类型
数据类型分为基本类型和引⽤类型:
基本类型:String、Number、Boolean、Null、Undefined
引⽤类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。
然后判断数据类型的⽅法⼀般可以通过:typeof、instanceof、constructor、toString四种常⽤⽅法
1、typeof:(可以对基本类型做出准确的判断,但对于引⽤类型,⽤它就有点⼒不从⼼了)
typeof 返回⼀个表⽰数据类型的字符串,返回结果包括:number、boolean、string、object、undefined、function等6种数据类型。
typeof 可以对JS基本数据类型做出准确的判断(除了null),⽽对于引⽤类型返回的基本上都是object, 其实返回object也没有错,因为所有对象的原型链最终都指向了Object,Object是所有对象的`祖宗`。但当我们需要知道某个对象的具体类型时,typeof 就显得有些⼒不从⼼了。
注意:typeof  null会返回object,因为特殊值null被认为是⼀个空的对象引⽤
2、instanceof
判断对象和构造函数在原型链上是否有关系,如果有关系,返回真,否则返回假
function Aaa(){
typeof array}
var a1 = new Aaa();
//alert( a1 instanceof Aaa);  //true判断a1和Aaa是否在同⼀个原型链上,是的话返回真,否则返回假
var arr = [];
alert( arr instanceof Aaa);//false
我们来看⼀下
var str = 'hello';
alert(str instanceof String);//false
var bool = true;
alert(bool instanceof Boolean);//false
var num = 123;
alert(num instanceof Number);//false
var nul = null;
alert(nul instanceof Object);//false
var und = undefined;
alert(und instanceof Object);//false
var oDate = new Date();
alert(oDate instanceof Date);//true
var json = {};
alert(json instanceof Object);//true
var arr = [];
alert(arr instanceof Array);//true
var reg = /a/;
alert(reg instanceof RegExp);//true
var fun = function(){};
alert(fun instanceof Function);//true
var error = new Error();
alert(error instanceof Error);//true
从上⾯的运⾏结果我们可以看到,基本数据类型是没有检测出他们的类型,但是我们使⽤下⾯的⽅式创建num、str、boolean,是可以检测出类型的:
var num = new Number(123);
var str = new String('abcdef');
var boolean = new Boolean(true);
3、constructor:查看对象对应的构造函数
constructor 在其对应对象的原型下⾯,是⾃动⽣成的。当我们写⼀个构造函数的时候,程序会⾃动添加:构造函数名.structor = 构造函数名
function Aaa(){
}
//structor = Aaa;  //每⼀个函数都会有的,都是⾃动⽣成的
//structor = Aaa;
判断数据类型的⽅法
var str = 'hello';
structor == String);//true
var bool = true;
structor == Boolean);//true
var num = 123;
structor ==Number);//true
// var nul = null;
// structor == Object);//报错
//var und = undefined;
//structor == Object);//报错
var oDate = new Date();
structor == Date);//true
var json = {};
structor == Object);//true
var arr = [];
structor == Array);//true
var reg = /a/;
structor == RegExp);//true
var fun = function(){};
structor ==Function);//true
var error = new Error();
structor == Error);//true
从上⾯的测试中我们可以看到,undefined和null是不能够判断出类型的,并且会报错。因为null和undefined是⽆效的对象,因此是不会有constructor存在的同时我们也需要注意到的是:使⽤constructor是不保险的,因为constructor属性是可以被修改的,会导致检测出的结果不正确
function Aaa(){
}
structor = Aaa;//程序可以⾃动添加,当我们写个构造函数的时候,程序会⾃动添加这句代码
function BBB(){}
structor = BBB;//此时我们就修改了Aaa构造函数的指向问题
strutor==Aaa);//false
可以看出,constructor并没有正确检测出正确的构造函数
4、String(可以说不管是什么类型,它都可以⽴即判断出)
toString是Object原型对象上的⼀个⽅法,该⽅法默认返回其调⽤者的具体类型,更严格的讲,是 toString运⾏时this指向的对象类型, 返回的类型
格式为[object xxx],xxx是具体的数据类型,其中包括:
String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,... 基本上所有对象的类型都可以通过这个⽅法获取到。
var str = 'hello';
console.log(String.call(str));//[object String]
var bool = true;
console.log(String.call(bool))//[object Boolean]
var num = 123;
console.log(String.call(num));//[object Number]
var nul = null;
console.log(String.call(nul));//[object Null]
var und = undefined;
console.log(String.call(und));//[object Undefined]
var oDate = new Date();
console.log(String.call(oDate));//[object Date]
var json = {};
console.log(String.call(json));//[object Object]
var arr = [];
console.log(String.call(arr));//[object Array]
var reg = /a/;
console.log(String.call(reg));//[object RegExp]
var fun = function(){};
console.log(String.call(fun));//[object Function]
var error = new Error();
console.log(String.call(error));//[object Error]
从这个结果也可以看出,不管是什么类型的,String.call();都可以判断出其具体的类型。
接下来我们分析⼀下四种⽅法各⾃的优缺点
不同类型的优
缺点
typeof instanceof constructor String.call
优点使⽤简单能检测出引⽤类型基本能检测所有的类型(除了null和
undefined)
检测出所有的类型
缺点只能检测出基本类型(出
null)
不能检测出基本类型,且不能跨
iframe
constructor易被修改,也不能跨iframe
IE6下,undefined和null均为
Object
从上表中我们看到了,instanceof和constructor不能跨iframe,上⾯没有细说,所以下⾯我们直接上例⼦喽
例:跨页⾯判断是否是数组
var oF = ateElement('iframe');
document.body.appendChild( oF );
var ifArray = window.frames[0].Array;
var arr = new ifArray();
//alert( structor == Array );  //false
//alert( arr instanceof Array );  //false
alert( String.call(arr) == '[object Array]' );  //true
};
从结果中可以看出,constructor和instanceof都没有正确的判断出类型,只有String.call();正确判断出了
其实⾯试官也经常喜欢让说⼀种最简单的判断是数组的⽅法,记住喽是String.call()哦!好了,今天就分享这些了!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。