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


Posted in Javascript onOctober 30, 2011

今天刚好在学习支付宝 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]'; 
} 
==============

UPDATE: 2010.12.31 00:01(出处)

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

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; 
}
Javascript 相关文章推荐
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
Feb 27 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
Apr 08 Javascript
复选框全选与全不选操作实现思路
Aug 18 Javascript
判断字符串的长度(优化版)中文占两个字符
Oct 30 Javascript
jQuery $命名冲突解决方案汇总
Nov 13 Javascript
jquery中map函数遍历数组用法实例
May 18 Javascript
jquery控制显示服务器生成的图片流
Aug 04 Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 Javascript
BootStrap 实现各种样式的进度条效果
Dec 07 Javascript
通过sails和阿里大于实现短信验证
Jan 04 Javascript
浅谈mint-ui loadmore组件注意的问题
Nov 08 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 Javascript
JS trim去空格的最佳实践
Oct 30 #Javascript
js中更短的 Array 类型转换
Oct 30 #Javascript
JavaScript Array Flatten 与递归使用介绍
Oct 30 #Javascript
关于图片按比例自适应缩放的js代码
Oct 30 #Javascript
js 弹出菜单/窗口效果
Oct 30 #Javascript
基于Jquery+Ajax+Json的高效分页实现代码
Oct 29 #Javascript
简单的前端js+ajax 购物车框架(入门篇)
Oct 29 #Javascript
You might like
PHP 面向对象实现代码
2009/11/11 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
js实现京东轮播图效果
2017/06/30 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
js实现选项卡效果
2020/03/07 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[58:37]Serenity vs Fnatic 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
会计岗位职责
2013/11/08 职场文书
调查研究项目计划书
2014/04/29 职场文书
无保留意见审计报告
2015/06/05 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
旅游安全责任协议书
2016/03/22 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
python turtle绘图命令及案例
2021/11/23 Python