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

news/2024/7/3 3:13:29

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

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

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; 
}


转载于:https://my.oschina.net/ohcoding/blog/470952


http://www.niftyadmin.cn/n/4084354.html

相关文章

java 输出excel_java 导出excel方法

到http://download.csdn.net/source/1781433下载jxl.jar文件/*Title是保存出来的文件名,gbl_LastOpenPath用于记录上次打开的路径*/public void ExportToExcel(JTable table, String Title){File DefaultFile;JFileChooser fc new JFileChooser();File file;if(gbl…

shell expect

ubuntu su root****************************************************expect << EOFspawn su rootexpect "密码&#xff1a;" send "$pass\r" expect eofEOF*******************************************************转载于:https://blog.51cto.com…

【ZT】SQL SERVER性能瓶頸監測

当您怀疑计算机硬件是影响SQL Server运行性能的主要原因时&#xff0c;可以通过SQL Server Performance Monitor监视相应硬件的负载&#xff0c;以证实您的猜测并找出系统瓶颈。下文将介绍一些常用的分析对象及其参数。 Memory: Page Faults / sec 如果该值偶尔走高&#xff0c…

java char int 运算符_Java - char, int conversions

小编典典第一个示例(编译)很特殊&#xff0c;因为加法的两个操作数都是文字。以下是一些定义&#xff1a;一个转换int到char被称为基本收缩转换&#xff0c;因为char是比较小的类型int。A 1是一个常量表达式。常量表达式(基本上)是一个表达式&#xff0c;其结果始终相同&#…

i18n php_国际化(I18N)

[TOC]#### 1. Yii::t() 方法可以像这样使用&#xff0c;如下所示&#xff1a;~~~//代码片段中&#xff0c;app 代表文本消息的类别echo \Yii::t(app, This is a message to translate!);~~~#### 2. 修改配置文件~~~components > [// ...i18n > [translations > [* >…

篇一、安装配置Android Studio

系统&#xff1a;Mac 10.10 Java JDK&#xff1a;官方JDK1.8 IDE&#xff1a;Android Studio 1.2 Android SDK&#xff1a;24.2 模拟器&#xff1a;genymtion 安装 Mac版本的Android Studio安装实在没有什么好讲的&#xff0c;把app拖到Application文件夹里面就好了。比Windows…

Mac上提取应用APP的LOGO

1、找到想提取LOGO的应用&#xff0c;右键「显示包内容」 2、 双击【Contents】文件夹&#xff0c;再双击【Resources】文件夹 3、双击图标打开&#xff0c;选择最清晰的一帧&#xff0c;右键【导出为】 4、选择保存位置&#xff0c;格式注意选择常见格式&#xff0c;如png

字符串的宽度

文本编辑器&#xff0c;就是捕获键盘事件&#xff0c;获得输入字符&#xff0c;在控件表面绘制字符串&#xff0c;设定光标位置。这一系列的文章&#xff0c;将告诉大家所有这些操作该如何处理&#xff0c;有什么注意点。这篇随笔将首先要讨论一个看似很简单&#xff0c;其实有…