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 setTimeout和setInterval计时的区别详解
Jun 21 Javascript
jQuery focus和blur事件的应用详解
Jan 26 Javascript
全面兼容的javascript时间格式化函数(比较实用)
May 14 Javascript
通过Jquery的Ajax方法读取将table转换为Json
May 31 Javascript
JavaScript整除运算函数ceil和floor的区别分析
Apr 14 Javascript
Jquery跨域获得Json的简单实例
May 18 Javascript
jQuery获取table行数并输出单元格内容的实现方法
Jun 30 Javascript
AngularJS表格样式简单设置方法示例
Mar 03 Javascript
vue.js利用Object.defineProperty实现双向绑定
Mar 09 Javascript
vue组件父子间通信之综合练习(聊天室)
Nov 07 Javascript
vue实现tab切换外加样式切换方法
Mar 16 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
Mar 21 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
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
PHP微信分享开发详解
2017/01/14 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
React简单介绍
2017/05/24 Javascript
Vue计算属性的使用
2017/08/04 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
Python中进程和线程的区别详解
2017/10/29 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
Weblogic的布署方式
2013/08/23 面试题
电大毕业生自我鉴定
2013/11/10 职场文书
《自然之道》教学反思
2014/02/11 职场文书
高三学习决心书
2014/03/11 职场文书
医师定期考核实施方案
2014/05/07 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
红色经典观后感
2015/06/18 职场文书