您的位置:首页 > Web前端 > JavaScript

javascript 类型检测

2015-03-03 15:59 148 查看
关于javascript的类型检测,根据浏览器的不同可能会产生不一样的结果,但是哥哥浏览器总有相同的地方,现在 总结一下各个浏览器通用的类型检测方法:

可以使用typeof的检测基本类型

String: typeof object === “string”
Number: typeof object === “number”
Boolean: typeof object === “boolean”
Object: typeof object === “object”


检测null类型

null: object === null
null or undefined: object == null


检测undefined类型

Global Variables全局变量: typeof variable === “undefined”
Local Variables 本地变量: variable === undefined
Properties属性: object.prop === undefined


检测是否为网页元素

Element: object.nodeType


检测复杂类型(jquery)(包括基本类型)

Plain Object: jQuery.isPlainObject( object )
Function: jQuery.isFunction( object )
Array: jQuery.isArray( object )


检测复杂类型(从jquery提取)(包括基本类型)

//前期准备
var class2type={};
class2type[ "[object Boolean]" ] ="boolean";
class2type[ "[object Number]" ] ="number";
class2type[ "[object String]" ] ="string";
class2type[ "[object Function]" ] ="function";
class2type[ "[object Array]" ] ="array";
class2type[ "[object Date]" ] ="date";
class2type[ "[object RegExp]" ] ="regexp";
class2type[ "[object Object]" ] ="object";
var type=function( obj ) {
return obj == null ?
String( obj ) :
class2type[ Object.prototype.toString.call(obj) ] || "object";
}
//如何使用

var isFunction = function( obj ) {
return type(obj) === "function";
}
var isArray = Array.isArray || function( obj ) {
return type(obj) === "array";
}
var isWindow = function( obj ) {
return obj != null && obj == obj.window;
}
var isPlainObject = function( obj ) {
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || isWindow( obj ) ) {
return false;
}
try {
if ( obj.constructor &&
! Object.prototype.hasOwnProperty.call(obj, "constructor") &&
! Object.prototype.hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}

var key;
for ( key in obj ) {}

return key === undefined ||  Object.prototype.hasOwnProperty.call( obj, key );
}

var isNumeric = function( obj ) {
return !isNaN( parseFloat(obj) ) && isFinite( obj );
}
var isEmptyObject = function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
}


检测自定义函数类型

function __typeof__(objClass)
{
if ( objClass != undefined && objClass.constructor )
{
var strFun = objClass.constructor.toString();
var className = strFun.substr(0, strFun.indexOf('('));
className = className.replace('function', '');
className=   classNam
4000
e.replace(/(^\s*)|(\s*$)/ig, '');
return className==""?"Anonymous":className;
}
return typeof(objClass);
}


//使用方法

<script language="javascript">
alert(__typeof__(jsclass));
alert(__typeof__(JSClass));
alert(__typeof__(1));
alert(__typeof__([]));
alert(__typeof__({}));
</script>

//结果分别为:"JSClass", "Function", "Number", "Array"和"Object"。


来自本方法来源

基本原理是由于objClass里有一个constructor指针,这个指针指向了创建objClass的function。我们找到这个function用tostring来返回整个function的字符串定义。然后截取前方的函数定义名(当然如果用var xxx=function(){}那么他就是一个匿名函数。返回一个Anonymous代替)

另外javascript还有一个方法instantof 这个并不是类型检测但却能知道这个对象究竟是哪个类型以及其父类型下的,返回bool值。比如

var a=new Array();
if (a instanceof Object) {
alert('Y');
}else {**重点内容**
alert('N')
}


返回为Y.

以上总结各有优缺点,基本上原生的方法typeof是最快的也是最推荐使用的。但是他的缺点也是最明显。有些类型不能真正的判断。如果你要判断的不是基本类型。那么使用typeof也是不错的选择,毕竟他可以获得自定义类型。同时兼顾了基本类型。不过鉴于我所使用的测试平台基本上限于浏览器,没有在其他平台上做测试。不知道能否使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息