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 相关文章推荐
Prototype使用指南之selector.js
Jan 10 Javascript
JavaScript中获取未知对象属性的代码
Apr 27 Javascript
js实现继承的5种方式
Dec 01 Javascript
Bootstrap布局之栅格系统详解
Jun 13 Javascript
JavaScript实现图片懒加载(Lazyload)
Nov 28 Javascript
jQuery图片拖动组件Dropzone用法示例
Jan 17 Javascript
jQuery实现百度登录框的动态切换效果
Apr 21 jQuery
理理Vue细节(推荐)
Apr 16 Javascript
前端插件之Bootstrap Dual Listbox使用教程
Jul 23 Javascript
layui实现根据table数据判断按钮显示情况的方法
Sep 26 Javascript
Vue切换div显示隐藏,多选,单选代码解析
Jul 14 Javascript
Openlayers实现测量功能
Sep 25 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
Memcache 在PHP中的使用技巧
2010/02/08 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
PHP 日,周,月点击排行统计
2012/01/11 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
JavaScript Timer实现代码
2010/02/17 Javascript
javascript按位非运算符的使用方法
2013/11/14 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
2017/12/25 jQuery
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
python flask 多对多表查询功能
2017/06/25 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
如何写求职信
2014/05/24 职场文书
商业街策划方案
2014/05/31 职场文书
见习报告格式要求
2014/11/04 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
自主招生自荐信范文
2015/03/04 职场文书
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫