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 相关文章推荐
解析John Resig Simple JavaScript Inheritance代码
Dec 03 Javascript
原生JavaScript实现连连看游戏(附源码)
Nov 05 Javascript
一个JavaScript函数把URL参数解析成Json对象
Sep 24 Javascript
JavaScript返回网页中超链接数量的方法
Apr 03 Javascript
jQuery+css实现的切换图片功能代码
Jan 27 Javascript
JS获取和修改元素样式的实例代码
Aug 06 Javascript
vue制作加载更多功能的正确打开方式
Oct 12 Javascript
最简单的JS实现json转csv的方法
Jan 10 Javascript
9102了,你还不会移动端真机调试吗
Mar 25 Javascript
微信小程序文字显示换行问题
Jul 28 Javascript
javascript自定义加载loading效果
Sep 15 Javascript
JS前端监控采集用户行为的N种姿势
Jul 23 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
PL-880隐藏功能
2021/03/01 无线电
图书管理程序(一)
2006/10/09 PHP
php执行sql语句的写法
2009/03/10 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
PHP模板引擎Smarty自定义变量调解器用法
2016/04/11 PHP
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
vue上传图片组件编写代码
2017/07/26 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
10行Python代码计算汽车数量的实现方法
2019/10/23 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
应届生煤化工求职信
2013/10/21 职场文书
学习标兵获奖感言
2014/02/20 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
节约用水广告语60条
2019/11/14 职场文书