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 getElementsByClassName函数
Apr 01 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
Sep 29 Javascript
js模拟点击以提交表单为例兼容主流浏览器
Nov 29 Javascript
FF IE浏览器修改标签透明度的方法
Jan 27 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
Mar 18 Javascript
从零学习node.js之express入门(六)
Feb 25 Javascript
jquery+css实现下拉列表功能
Sep 03 jQuery
vue 每次渲染完页面后div的滚动条保持在最底部的方法
Mar 17 Javascript
微信小程序自定义键盘 内部虚拟支付
Dec 20 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
May 09 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
Jun 10 Javascript
jquery弹窗时禁止body滚动条滚动的例子
Sep 21 jQuery
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
一个查看session内容的函数
2006/10/09 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
PHP 验证码的实现代码
2011/07/17 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
Python中input和raw_input的一点区别
2014/10/21 Python
在Django的模型中添加自定义方法的示例
2015/07/21 Python
python对视频画框标记后保存的方法
2018/12/07 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
python基于SMTP协议发送邮件
2019/05/31 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
Python实现自动签到脚本功能
2020/08/20 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
前台接待员岗位职责
2014/01/02 职场文书
展会邀请函范文
2014/01/26 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
敬老院活动总结
2014/04/28 职场文书
出差报告范文
2014/11/06 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
学校运动会感想
2015/08/10 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android