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 select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
Dec 19 Javascript
JavaScript 设计模式学习 Singleton
Jul 27 Javascript
jquery.combobox中文api和例子,修复了上面的小bug
Mar 28 Javascript
JS继承 笔记
Jul 13 Javascript
表单验证的完整应用案例探讨
Mar 29 Javascript
jQuery学习笔记之总体架构
Jun 03 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
Jul 18 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
May 31 Javascript
Vue.js系列之vue-router(上)(3)
Jan 03 Javascript
Angular2整合其他插件的方法
Jan 20 Javascript
javascript创建元素和删除元素实例小结
Jun 19 Javascript
关于vue.js中实现方法内某些代码延时执行
Nov 14 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对象在内存中的存在形式分析
2015/02/03 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
12306验证码破解思路分享
2015/03/25 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
Python字符串处理函数简明总结
2015/04/13 Python
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
python生成IP段的方法
2015/07/07 Python
解决DataFrame排序sort的问题
2018/06/07 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
对Python 内建函数和保留字详解
2018/10/15 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
html5 视频播放解决方案
2016/11/06 HTML / CSS
linux下进程间通信的方式
2013/01/23 面试题
工作时间上网检讨书
2014/02/03 职场文书
医学生求职自荐书
2014/06/12 职场文书
就业协议书样本
2014/08/20 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
个人贷款收入证明
2014/10/26 职场文书
小学数学国培研修日志
2015/11/13 职场文书
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电