js中的数据类型检测

js中的数据类型检测常用的方法是使用typeof,typeof运算符会返回下列6中类型之一:

  • "number"
  • "string"
  • "boolean"
  • "object"
  • "function"
  • "undefined"

例如:

 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6     <script type="text/javascript">
 7         var a="a";
 8         var b=2;
 9         var c=undefined;
10         var d=null;
11         var e={};
12         function f(){
13             return true;
14         }
15         console.log(typeof(a));
16         console.log(typeof(b));
17         console.log(typeof(c));
18         console.log(typeof(d));
19         console.log(typeof(e));
20         console.log(typeof(f));    
21     </script>
22 </head>
23 <body>
24     
25 </body>
26 </html>

结果如下:

从结果中可以看出使用typeof检测null值时,返回的是object,而不是null。这样其实并不能真正的检测出数据类型。可以向下面定义一个方法检测出null类型。

 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6     <script type="text/javascript">
 7         var a="a";
 8         var b=2;
 9         var c=undefined;
10         var d=null;
11         var e={};
12         function f(){
13             return true;
14         }
15         function type(o){
16             console.log((o===null)?"null":(typeof(o)));
17         }
18         type(a);
19         type(b);
20         type(c);
21         type(d);
22         type(e);
23         type(f);
24     </script>
25 </head>
26 <body>
27     
28 </body>
29 </html>

 得到的结果如下:

而对于复杂的数据类型,比如对象或者数组,可以使用constructor属性。constructor属性可以判断绝大部分数据的类型,但是对undefined和null类型并不适用,因为javascript解释器会抛出异常。

数值直面量也不能使用constructor属性,可以加上一个小括号,将数值转化为对象,例如:

 alert((1).constructor); 

对于内置对象,使用toString()方法检测对象类型时最安全、最准确的。调用toString()方法把对象转化为字符串,然后通过检测字符串中是否包含数组所特有的标志字符可以确定对象的类型。

例如:

 1 function typeof(o){
 2       var _toString=Object.prototype.toString;
 3       var _type={
 4                  "undefined":"undefined",
 5                  "number":"number",
 6                  "boolean":"boolean",
 7                  "string":"string",
 8                  "[object Function]":"function",
 9                  "[object Array]":"array",
10                  "[object RegExp]":"regexp",
11                  "[object Date]":"date",
12                  "[object Erroe]":"error"
13         }
14         return _type[typeof o]||_type[_toString.call(o)]||(o?"object":"null");
15 }
16                   

 对于非内置对象,只能使用constructor属性和instanceof运算符来实现。

原文地址:https://www.cnblogs.com/yangxiaoguai132/p/5223701.html