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 相关文章推荐
jQuery 锚点跳转滚动条平滑滚动一句话代码
Apr 30 Javascript
js函数setTimeout延迟执行的简单介绍
Jul 17 Javascript
JS实现静止元素自动移动示例
Apr 14 Javascript
jquery实现用户打分评分特效
May 28 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
Oct 28 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
Jul 24 Javascript
JavaScript定时器setTimeout()和setInterval()详解
Aug 18 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
Mar 06 Javascript
利用Vue构造器创建Form组件的通用解决方法
Dec 03 Javascript
JavaScript迭代器的含义及用法
Jun 21 Javascript
ES6学习笔记之let与const用法实例分析
Jan 22 Javascript
详解vue 组件的实现原理
Nov 12 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
ThinkPHP验证码使用简明教程
2014/03/05 PHP
ThinkPHP3.1.3版本新特性概述
2014/06/19 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
extjs render 用法介绍
2013/09/11 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
javascript动态设置样式style实例分析
2015/05/13 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
Js和VUE实现跑马灯效果
2020/05/25 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
python如何读写json数据
2018/03/21 Python
Python实现搜索算法的实例代码
2020/01/02 Python
毕业求职自荐信格式是什么
2013/11/19 职场文书
会计专业自荐信
2013/12/02 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
考核工作实施方案
2014/03/30 职场文书
党员查摆剖析材料
2014/10/10 职场文书
环保证明
2015/06/23 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
合作合同协议书
2016/03/21 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书