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 相关文章推荐
textContent在Firefox下与innerText等效的属性
May 12 Javascript
关于document.cookie的使用javascript
Apr 11 Javascript
ext form 表单提交数据的方法小结
Aug 08 Javascript
Jquery实现搜索框提示功能示例代码
Aug 13 Javascript
jQuery中delegate()方法用法实例
Jan 19 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
Sep 06 Javascript
利用JS提交表单的几种方法和验证(必看篇)
Sep 17 Javascript
微信小程序如何自定义table组件
Jun 29 Javascript
vue简单练习 桌面时钟的实现代码实例
Sep 19 Javascript
js滚轮事件 js自定义滚动条的实现
Jan 18 Javascript
js实现复制粘贴的两种方法
Dec 04 Javascript
Jquery+javascript实现支付网页数字键盘
Dec 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
论坛头像随机变换代码
2006/10/09 PHP
php实现的CSS更新类实例
2014/09/22 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
AngularJS实现网站换肤实例
2021/02/19 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
npm qs模块使用详解
2020/02/07 Javascript
Python 正则表达式操作指南
2009/05/04 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
分析在Python中何种情况下需要使用断言
2015/04/01 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
python制作抖音代码舞
2019/04/07 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
flask项目集成swagger的方法
2020/12/09 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
机械专业应届生求职信
2013/09/21 职场文书
教育实习生的自我评价分享
2013/11/21 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
会议欢迎标语
2014/06/30 职场文书
机械操作工岗位职责
2014/08/08 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
辞职书格式样本
2015/02/26 职场文书
初中美术教学反思
2016/02/17 职场文书