【javascript学习指南】JavaScript数据类型判断typeof函数

更新时间:2017-11-05    来源:php函数    手机版     字体:

【www.bbyears.com--php函数】

typeof方法,比如:

 代码如下

<script type="text/javascript">
// var a=[0];
document.write(isArray(a),"
");
function isArray(obj){
return (typeof obj=="object")&&obj.constructor==Array;
}
//]]>
</script>

但是,该方法在一些浏览器中并不是像我们想像的那样工作。

1、Firefox2和Firefox3
在这两个浏览器中,用typeof检测HTML对象元素的类型,得到是一个不精确的“function”结果,而不是“object”,如HTMLDocument。如:


alert(typeof HTMLDocument);
//在Firefox2中结果是"function";
//在Firefox3中结果是"object";

2、Firefox2
对于正则表达式,在该浏览器中返回的结果是“function”(在Firefox3中结果是“object”),如:


var reg = /test/;
alert(typeof reg);
//在Firefox2中结果是"function";
//在Firefox3中结果是"object";

注:本人在safari中测试,其结果也是“function”。
3、IE6和IE7
在IE中对DOM元素使用typeof方法,得到的结果是“object”。如:


alert(typeof document.getElementsByTagName("body")[0].getAttribute);
//结果是"object"

4、Safari 3
safari认为DOM元素的NodeList是一个函数,如:


alert(typeof document.body.childNodes);
//结果是"function"

很明显,如果你要测试一个对象是否为函数,使用typeof方法并不能从真正意义上保证测试结果。那么,我们就需要一种在所有浏览器中都能保证测试结果的解决方案。我们知道function本身有apply()和call()两种方法,但这两个方法在IE中存在问题的函数中并不存在,试试下面的测试:


alert(typeof document.getElementsByTagName("body")[0].getAttribute.call)
//在IE中结果是"undefined"

显然,我们不能利用这两个方法。

1.isUndefined 与 使用全等(===)或typeof 多了一层函数调用。很明显多一层函数调用比直接使用原生的运算符效率会低(虽然有些微不足道),但如果isUndefined调用次数很多如上万次还是很 明显的。我曾经在邮箱框架中加入了该函数,调用次数有4000多次,从性能分析工具看占用了近1%的时间。仅仅一个判断占1%的调用时间还是很可怕的。当 然,邮箱框架内的isUndefined处在多层闭包的顶层,访问其也会占用较多时间。如果这一条还不足以让你放弃isUndefined,

2.函数从一定程度上是对一些代码的封装,抽象。是组织良好代码的方式之一,且有利于降低代码的复杂性。但isNull/isUndefined/isBoolean/isNumber/isString函数内仅有一句,抽象层次很低。因此完全不必封装而提取出一个函数。

3.isUndefined(a) 与 a === undefined相比并不会节省几个字节(呵,你可以命名的更短但损失了可读性)。

 代码如下

isNull: function(a){
 return a === null;
},
isUndefined: function(a){
 return a === undefined;
},
isNumber: function(a){
 return typeof a === "number";
},
isString: function(a){
 return typeof a === "string";
},
isBoolean: function(a){
 return typeof a === "boolean";
},
isPrimitive: function(b){
 var a = typeof b;
 return !!(b === undefined || b === null || a == "boolean" || a == "number" || a == "string");  
},
isArray: function(a){
 return proto_obj.toString.call(a) === "[object Array]";
},
isFunction: function(a){
 return proto_obj.toString.call(a) === "[object Function]";
},
isPlainObject: function(o){
 if (!o || o === win || o === doc || o === doc.body) {
  return false;
 }
 return "isPrototypeOf" in o && proto_obj.toString.call(o) === "[object Object]";  
},
isWindow: function(o){
 return o && typeof o === "object" && "setInterval" in o;
},
isEmptyObject: function(o){
    for(var a in o) {
 return false;
    }
    return true;
}

附上一个朋友写的

 1 判断是否为数组类型

 

 代码如下 <script type="text/javascript">
// var a=[0];
document.write(isArray(a),"
");
function isArray(obj){
return (typeof obj=="object")&&obj.constructor==Array;
}
//]]>
</script>


2 判断是否为字符串类型

 代码如下

 

<script type="text/javascript">
// document.write(isString("test"),"
");
document.write(isString(10),"
");
function isString(str){
return (typeof str=="string")&&str.constructor==String;
}
//]]>
</script>
 

3 判断是否为数值类型

 代码如下

 

<script type="text/javascript">
// document.write(isNumber("test"),"
");
document.write(isNumber(10),"
");
function isNumber(obj){
return (typeof obj=="number")&&obj.constructor==Number;
}
//]]>
</script>
 

4 判断是否为日期类型

 

 代码如下 <script type="text/javascript">
// document.write(isDate(new Date()),"
");
document.write(isDate(10),"
");
function isDate(obj){
return (typeof obj=="object")&&obj.constructor==Date;
}
//]]>
</script>

 

5 判断是否为函数

 

 代码如下  
<script type="text/javascript">
// document.write(isFunction(function test(){}),"
");
document.write(isFunction(10),"
");
function isFunction(obj){
return (typeof obj=="function")&&obj.constructor==Function;
}
//]]>
</script>
 

6 判断是否为对象

 代码如下

<script type="text/javascript">
linenum
// document.write(isObject(new Object()),"
");
document.write(isObject(10),"
");
function isObject(obj){
return (typeof obj=="object")&&obj.constructor==Object;
}
//]]>
</script>

本文来源:http://www.bbyears.com/jiaocheng/36822.html