js语法学习之判断一个对象是否为数组


Posted in Javascript onMay 13, 2014

1,真正的数组的判断方法

javascript中最简单的声明数组方法为:
var a = [];
判断是否为数组的最直接的方法为:

a instanceof Array //true 
a .constructor == Array //true

这里涉及到一个instanceof语法,instanceof是一个云算符,与"+-*/"一样,它的语法如下:
result = obj intanceof class
是用来判断一个对象是否是某个class的一个实例,运算结果返回true或者false。javascript中class的定义又是通过构造函数进行初始化的,所以instanceof语法的右操作符class一定是Function的实例,即class instanceof Function一定为true,而且如果使用instanceof时右操作符不是Function,就会抛出TypeError异常。所有对象都是Object的实例,所以任何对象instanceof Object都返回true。虽然我们说对象都是通过构造函数进行初始化的,但是instanceof却不是通过检查对象是否由该函数构造的,而是通过是否由构造函数的prototype继承来的,下面这个例子可以说明这个问题:
function Range(low, high) { 
this.low = low; 
this.high = high; 
} 
Range.prototype.constructor == Range; //true 
Range.prototype = { 
include: function(x){ return (x >= this.low && x <= this.high); }, 
exclude: function(x){ return (x < this.low && x > this.high); } 
} 
var r = new Range(0, 100); 
r instanceof Range; //false 
r instanceof Object; //true 
Range.prototype.constructor == Objecct; //true

这里虽然r是通过new Range构造的,但是r却并不是Range的实例,这就是问题所在,Range.prototype赋值语句覆盖了默认的构造函数,没对prototype赋值之前Range.prototype.constructor为Range,赋值之后变成了Object,这也好理解,因为
Range.prototype = { 
include: function(x){ return (x >= this.low && x <= this.high); }, 
exclude: function(x){ return (x < this.low && x > this.high); } 
}

其实等价于:
Range.prototype = new Object({ 
include: function(x){ return (x >= this.low && x <= this.high); }, 
exclude: function(x){ return (x < this.low && x > this.high); } 
});

所以Range.prototype.constructor == Object,那么通过new Range创建出来的实例当然就是Object的一个实例了。
看官方解释更直接些:
The instanceof operator does not actually check whether r was initialized by the Range constructor. It checks whether it inherits from Range.prototype.
javascript中还有一个函数typeof具有与instanceof类似的功能,但是它返回的是具体的基本数据类型:number,string,function,object,undefined,boolean,只有这六种,不在这六种范围内的都返回object,也就是说typeof([])返回的是object,而不是array。
另一个涉及到的语法是constructor,constructor返回对象的构造函数:
var a = []; 
a.constructor; //Array

构造函数是一个对象的初始化函数,采用new调用,如果对象是一个Array,那么其constructor应该就是Array,自己写的类就不一定了,因为可能会吧prototype中的constructor更改掉。

2,伪数组的判断方法

javascript中有一种伪数组,它可以使用类似于Array的遍历方法进行遍历,有length属性获取元素的长度,可以使用[]下标来获取指定的元素,这种对象我们称之为伪数组,JQuery中的对象就是典型的伪数组,如下图:
js语法学习之判断一个对象是否为数组 
所以判断是否是伪数组的关键就是判断是否有length属性,是否存在基本的数组操作函数splice,下面就是判断方法:

var is_array = function(value) { 
return value && 
typeof value === 'object' && 
typeof value.length === 'number' && 
typeof value.splice === 'function' && 
!(value.propertyIsEnumerable('length')); 
};

这里propertyIsEnumerable就是用来判断length属性是否可列举,其实原生的String对象也是有类似Array的效果,但是我们不能把它当作Array对象,所以这里需要判断typeof value == "object",因为typeof一个String对象,返回的是string。
Javascript 相关文章推荐
JavaScript(js)设置默认输入焦点(focus)
Dec 28 Javascript
动态读取JSON解析键值对的方法
Jun 03 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
Dec 31 Javascript
jQuery实现跟随鼠标运动图层效果的方法
Feb 02 Javascript
jQuery Ajax调用WCF服务详细教程
Mar 31 Javascript
JavaScript的jQuery库插件的简要开发指南
Aug 12 Javascript
JavaScript随机生成颜色的方法
Oct 15 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
JS实现仿PS的调色板效果完整实例
Dec 21 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
Aug 03 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
Jun 18 Javascript
js中定义一个变量并判断其是否为空的方法
May 13 #Javascript
jQuery 计算iframe 窗口大小的方法
May 13 #Javascript
js 调用百度地图api并在地图上进行打点添加标注
May 13 #Javascript
两种不同的方法实现js对checkbox进行全选和反选
May 13 #Javascript
js浏览器本地存储store.js介绍及应用
May 13 #Javascript
js 获取时间间隔实现代码
May 12 #Javascript
Jquery跳到页面指定位置的方法
May 12 #Javascript
You might like
PHP分页显示制作详细讲解
2006/10/09 PHP
PHP生成HTML静态页面实例代码
2008/08/31 PHP
PHP编实现程动态图像的创建代码
2008/09/28 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
Python获取脚本所在目录的正确方法
2014/04/15 Python
解决python "No module named pip" 的问题
2018/10/13 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Django 开发环境配置过程详解
2019/07/18 Python
Django工程的分层结构详解
2019/07/18 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
小区文明倡议书
2014/05/16 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
安全标语口号
2014/06/09 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
HTML中的表格元素介绍
2022/02/28 HTML / CSS
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android