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 相关文章推荐
将form表单中的元素转换成对象的方法适用表单提交
May 02 Javascript
jquery数组过滤筛选方法grep()简介
Jun 06 Javascript
纯JavaScript实现的分页插件实例
Jul 14 Javascript
jquery实现鼠标滑过小图查看大图的方法
Jul 20 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
Mar 01 Javascript
js拖拽的原型声明和用法总结
Apr 04 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
Sep 06 Javascript
详解Angular的数据显示优化处理
Dec 26 Javascript
angular1.x ui-route传参的三种写法小结
Aug 31 Javascript
微信小程序实现页面分享onShareAppMessage
Aug 12 Javascript
angularjs自定义过滤器demo示例
Aug 24 Javascript
Vue.set 全局操作简单示例
Sep 19 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
第五节 克隆 [5]
2006/10/09 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
什么是JavaScript
2009/08/13 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
Javascript的this详解
2019/03/23 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
python怎么判断模块安装完成
2020/06/19 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
html5 input属性使用示例
2013/06/28 HTML / CSS
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
《宿建德江》教学反思
2014/04/23 职场文书
应聘英语教师求职信
2014/04/24 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
门市房租房协议书
2014/12/04 职场文书
入伍通知书
2015/04/23 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL