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 相关文章推荐
jQuery 剧场版 你必须知道的javascript
May 27 Javascript
jquery.tmpl JQuery模板插件
Oct 10 Javascript
JQuery AJAX 中文乱码问题解决
Jun 05 Javascript
js判断变量初始化的三种形式及推荐用的形式
Jul 22 Javascript
JavaScript操作Oracle数据库示例
Mar 06 Javascript
Javascript中的包装类型介绍
Apr 02 Javascript
location.hash保存页面状态的技巧
Apr 28 Javascript
Angular获取手机验证码实现移动端登录注册功能
May 17 Javascript
highcharts 在angular中的使用示例代码
Sep 20 Javascript
原生JS上传大文件显示进度条 php上传文件代码
Mar 27 Javascript
npm全局模块卸载及默认安装目录修改方法
May 15 Javascript
浅析vue.js数组的变异方法
Jun 30 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
DC动漫人物排行
2020/03/03 欧美动漫
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
javascript 写类方式之六
2009/07/05 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
php图像生成函数之间的区别分析
2012/12/06 Javascript
js单例模式的两种方案
2013/10/22 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
js实现文本上下来回滚动
2017/02/03 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
Python中的True,False条件判断实例分析
2015/01/12 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
手机配件第一品牌:ZAGG
2017/05/28 全球购物
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
文秘专业自荐信
2013/10/14 职场文书
书法比赛获奖感言
2014/02/10 职场文书
班级旅游计划书
2014/05/03 职场文书
食品安全标语
2014/06/07 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
小学生毕业评语
2014/12/26 职场文书
幼儿园见习总结
2015/06/23 职场文书
大学生活感想
2015/08/10 职场文书