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 相关文章推荐
JavaScript 学习笔记二 字符串拼接
Mar 28 Javascript
Dom 结点创建 基础知识
Oct 01 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
May 20 Javascript
5个JavaScript经典面试题
Oct 13 Javascript
在JavaScript中使用开平方根的sqrt()方法
Jun 15 Javascript
jQuery实现获取绑定自定义事件元素的方法
Dec 02 Javascript
javascript中Date format(js日期格式化)方法小结
Dec 17 Javascript
Bootstrap表单组件教程详解
Apr 26 Javascript
Javascript基础之数组的使用
May 13 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
Aug 14 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
Nov 27 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
Jun 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
BBS(php &amp; mysql)完整版(五)
2006/10/09 PHP
PHP4实际应用经验篇(3)
2006/10/09 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
php框架知识点的整理和补充
2021/03/01 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
js图片延迟加载(Lazyload)三种实现方式
2017/03/01 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
python 实现登录网页的操作方法
2018/05/11 Python
python3实现随机数
2018/06/25 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
车队司机自我鉴定
2014/03/02 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
三好学生事迹材料
2014/12/24 职场文书
销售合作意向书范本
2015/05/08 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
SSM VUE Axios详解
2021/10/05 Vue.js
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL