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 相关文章推荐
JS面向对象、prototype、call()、apply()
May 14 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
使用js实现雪花飘落效果
Aug 26 Javascript
技术男用来对妹子表白的百度首页
Jul 23 Javascript
JS实现IE状态栏文字缩放效果代码
Oct 24 Javascript
详解javascript的变量与标识符
Jan 04 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
Aug 24 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
Mar 03 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
Jun 03 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
Jul 27 Javascript
js JSON.stringify()基础详解
Jun 19 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
Nov 16 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数组无限分级数据的层级化处理代码
2012/12/29 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
PHP设计模式之适配器模式代码实例
2015/05/11 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
一个超级简单的python web程序
2014/09/11 Python
Python中的异常处理学习笔记
2015/01/28 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Python是什么 Python的用处
2020/05/26 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
python复合条件下的字典排序
2020/12/18 Python
求职信格式要求
2014/05/23 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
模范班主任事迹材料
2014/12/17 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
房屋认购协议书
2015/01/29 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书