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 相关文章推荐
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
javascript加号"+"的二义性说明
Mar 04 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
Oct 01 Javascript
javaScript实现可缩放的显示区效果代码
Oct 26 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
Nov 09 Javascript
日常收藏的jquery技巧
Dec 02 Javascript
基于jQuery实现的无刷新表格分页实例
Feb 17 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
微信小程序wxml列表渲染原理解析
Nov 27 Javascript
JavaScript手写数组的常用函数总结
Nov 22 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
PHP基本语法总结
2014/09/06 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
老生常谈文本文件和二进制文件的区别
2017/02/27 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
2019/05/21 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
为python设置socket代理的方法
2015/01/14 Python
Python获取网页上图片下载地址的方法
2015/03/11 Python
python图像处理之镜像实现方法
2015/05/30 Python
python学生管理系统代码实现
2020/04/05 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
学习python的前途 python挣钱
2019/02/27 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
python 实现多维数组转向量
2019/11/30 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
Python 图片处理库exifread详解
2021/02/25 Python
美国社交购物市场:MassGenie
2019/02/18 全球购物
365 Tickets英国:全球景点门票
2019/07/06 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
生物制药专业自我鉴定
2014/02/19 职场文书
多表查询、事务、DCL
2021/04/05 MySQL