js判断是否为数组的函数: isArray()

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

代码如下:

if (value instanceof Array ||
(!(value instanceof Object) &&
(Object.prototype.toString.call((value)) =='[object Array]') ||
typeof value.length == 'number' &&
typeof value.splice != 'undefined'&&
typeof value.propertyIsEnumerable !='undefined' &&
!value.propertyIsEnumerable('splice'))) {
return 'array';
}


怎么说呢,乱。当然,也可以说是,“史上最全”,它确实使用了最主流的方法,只是把他们都写一起了而已。

像我们所知道的,用 instanceof 和 constructor 是最直接的、简单的方式:

代码如下:

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

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

代码如下:

var is_array = function(value) {
return value &&
typeof value === 'object' &&
typeof value.length === 'number' &&
typeof value.splice === 'function'&&
!(value.propertyIsEnumerable('length'));
};

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

代码如下:

Object.prototype.toString.call(value) =='[object Array]'

上面这种写法,是 jQuery 正在使用的。目前,淘宝的 kissy 也是使用这种方式。难道这不是目前最简洁,而且最有效的方式么?个人感觉内部框架写得有点累赘了。例行总结,最终方案:

代码如下:

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

判断类型,很酷。具体的,跟上面是一个道理:

代码如下:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值