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 打印内容方法小结
Nov 04 Javascript
ModelDialog JavaScript模态对话框类代码
Apr 17 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
Sep 02 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
node.js中的fs.exists方法使用说明
Dec 17 Javascript
javascript弹出页面回传值的方法
Jan 28 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
Nov 04 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
Oct 14 Javascript
ajax异步请求详解
Jan 06 Javascript
基于vue中解决v-for使用报红并出现警告的问题
Mar 03 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
Aug 25 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
Oct 17 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
yii实现级联下拉菜单的方法
2014/07/31 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
表单验证正则表达式实例代码详解
2015/11/09 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
pandas分区间,算频率的实例
2019/07/04 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Hotter Shoes英国官网:英伦风格,舒适的鞋子
2017/12/28 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
医学生实习自我鉴定
2013/09/27 职场文书
合作意向书模板
2014/03/31 职场文书
环境卫生标语
2014/06/09 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
2014年班务工作总结
2014/12/02 职场文书
课外活动实习计划
2015/01/19 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
Python连续赋值需要注意的一些问题
2021/06/03 Python
Python制作表白爱心合集
2022/01/22 Python