A-A+

js判断是否为数组的函数

2016年10月14日 前端设计 暂无评论 阅读 6 views 次

下面来给大家介绍js判断是否为数组的函数,在js中没有像php那样有isarray函数了,我们需要通过自定函数实例。

我们常用的datearray.constructor==Array来判断,代码如下:

  1. <script language="javascript">  
  2. var ret = false;  
  3. var datearray = Array();  
  4. if( datearray.constructor==Array )  
  5. {//xiariboke.net  
  6.  alert('是数组');  
  7. }  
  8. else  
  9. {  
  10.  alert("不是数组");  
  11. }  
  12. </script>  

今天刚好在学习支付宝 JS 框架 base.js,瞄了一下,实现是这样的,代码如下:

  1. if (value instanceof Array ||  
  2.  (!(value instanceof Object) &&  
  3.  (Object.prototype.toString.call((value)) == '[object Array]') ||  
  4.  typeof value.length == 'number' &&  
  5.  typeof value.splice != 'undefined' &&  
  6.  typeof value.propertyIsEnumerable != 'undefined' &&  
  7.  !value.propertyIsEnumerable('splice'))) {  
  8.  return 'array';  
  9. }  

怎么说呢,乱。当然,也可以说是,“史上最全”,它确实使用了最主流的方法,只是把他们都写一起了而已,像我们所知道的,用 instanceof 和 constructor 是最直接的、简单的方式,代码如下:

  1. var arr = [];  
  2. arr instanceof Array; // true  
  3. arr.constructor == Array; //true  

只是,由于在不同 iframe 中创建的 Array 并不共享 prototype,如果这样用,麻烦就来了,那么,如果要应用在框架中,这种方式肯定是行不通的。倒是,使用 Douglas Crockford 的填鸭式方法是可以解决这个问题(《JavaScript 语言精粹》P61),代码如下:

  1. var is_array = function(value) {  
  2.  return value &&  
  3.         typeof value === 'object' &&  
  4.         typeof value.length === 'number' &&  
  5.         typeof value.splice === 'function' &&  
  6.         !(value.propertyIsEnumerable('length'));  
  7. };  

不过,是否还有更简单的方法呢?其实,像我们自己用的,不就是了么?

Object.prototype.toString.call(value) == '[object Array]'上面这种写法,是 jQuery 正在使用的。目前,淘宝的 kissy 也是使用这种方式。难道这不是目前最简洁,而且最有效的方式么?个人感觉内部框架写得有点累赘了。例行总结,最终方案:

  1. var isArray = function(obj) {  
  2.     return Object.prototype.toString.call(obj) === '[object Array]';  
  3. }  

UPDATE: 2010.12.31 00:01(出处)

判断类型,很酷,具体的,跟上面是一个道理,代码如下:

  1. var is = function (obj,type) {  
  2.         return (type === "Null" && obj === null) ||  
  3.         (type === "Undefined" && obj === void 0 ) ||  
  4.         (type === "Number" && isFinite(obj)) ||  
  5.          Object.prototype.toString.call(obj).slice(8,-1) === type;  
  6. }  
标签:

给我留言