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 建设银行登陆键盘
Jun 10 Javascript
JavaScript 垃圾回收机制分析
Oct 10 Javascript
Google Dart编程语法和基本类型学习教程
Nov 27 Javascript
jQuery实现的导航条切换可显示隐藏
Oct 22 Javascript
浅谈JavaScript数据类型
Mar 03 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
Jan 13 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
Dec 18 Javascript
Vue的elementUI实现自定义主题方法
Feb 23 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
Apr 26 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
Mar 10 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
May 13 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
May 18 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_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
深入理解js中this的用法
2016/05/28 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
layui树形菜单动态遍历的例子
2019/09/23 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
python添加模块搜索路径方法
2017/09/11 Python
ubuntu上安装python的实例方法
2019/09/30 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
如何用SQL语句进行模糊查找
2015/09/25 面试题
幼儿园亲子活动方案
2014/01/29 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
工程承包协议书
2014/04/22 职场文书
个人整改方案范文
2014/10/25 职场文书
安全知识竞赛主持词
2015/06/30 职场文书
施工安全责任协议书
2016/03/23 职场文书
OpenCV实现普通阈值
2021/11/17 Java/Android