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 相关文章推荐
扩展easyui.datagrid,添加数据loading遮罩效果代码
Nov 02 Javascript
js有关元素内容操作小结
Dec 20 Javascript
jquery插件制作 手风琴Panel效果实现
Aug 17 Javascript
jquery弹出框的用法示例(一)
Aug 26 Javascript
jquery分割字符串的方法
Jun 24 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
Sep 18 Javascript
HTML5 js实现拖拉上传文件功能
Nov 20 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
使用react实现手机号的数据同步显示功能的示例代码
Apr 03 Javascript
JS实现键值对遍历json数组功能示例
May 30 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
Sep 10 Javascript
JavaScript实现拖拽和缩放效果
Aug 24 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中创建并处理图象
2006/10/09 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
Javascript 复制数组实现代码
2009/11/26 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
python微信公众号开发简单流程
2018/03/23 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
区分python中的进程与线程
2020/08/13 Python
大学生就业自我鉴定
2013/10/26 职场文书
餐饮主管岗位职责
2013/12/10 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
2015年党性分析材料
2014/12/19 职场文书
2015年财务部工作总结
2015/04/10 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
利用Python实现模拟登录知乎
2022/05/25 Python