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 相关文章推荐
jQuery 判断元素上是否绑定了事件
Oct 28 Javascript
使用JavaScript库还是自己写代码?
Jan 28 Javascript
Pro JavaScript Techniques学习笔记
Dec 28 Javascript
JqGrid web打印实现代码
May 31 Javascript
解决遍历时Array.indexOf产生的性能问题
Jul 03 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
Aug 24 Javascript
javascript实现dom元素可拖动
Mar 21 Javascript
AngularJS中使用three.js的实例详解
Jul 21 Javascript
vue事件修饰符和按键修饰符用法总结
Jul 25 Javascript
Node 模块原理与用法详解
May 13 Javascript
详解React 条件渲染
Jul 08 Javascript
JavaScript实现多球运动效果
Sep 07 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
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
PHP 在线翻译函数代码
2009/05/07 PHP
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
树莓派实现移动拍照
2019/06/22 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
周年庆典邀请函范文
2014/01/23 职场文书
消防安全检查制度
2014/02/04 职场文书
电台实习生求职信
2014/02/25 职场文书
授权委托书协议书
2014/10/16 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
基于flask实现五子棋小游戏
2021/05/25 Python