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中为什么null==0为false而null大于=0为true(个人研究)
Sep 16 Javascript
js实现Select列表内容自动滚动效果代码
Aug 20 Javascript
jquery实现网页的页面平滑滚动效果代码
Nov 02 Javascript
跟我学习JScript的Bug与内存管理
Nov 18 Javascript
JS鼠标拖拽实例分析
Nov 23 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
May 24 Javascript
Vue.use源码分析
Apr 22 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
Aug 26 jQuery
vue2.0基于vue-cli+element-ui制作树形treeTable
Apr 30 Javascript
微信小程序与公众号卡券/会员打通的问题
Jul 25 Javascript
vue实现文字加密功能
Sep 27 Javascript
vue 解决addRoutes多次添加路由重复的操作
Aug 04 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 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
JavaScript 乱码问题
2009/08/06 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
javascript运动详解
2015/07/06 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
Pycharm学习教程(1) 定制外观
2017/05/02 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
SQL中where和having的区别
2012/06/17 面试题
delegate与普通函数的区别
2014/01/22 面试题
法雷奥SQA(electric)面试问题
2016/01/23 面试题
设计师个人求职信范文
2014/02/02 职场文书
电台实习生求职信
2014/02/25 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
共青团员自我评价
2015/03/10 职场文书
目标责任书格式范文
2015/05/11 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
2016年学校招生广告语
2016/01/28 职场文书
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js