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 相关文章推荐
用JS判断IE版本的代码 超管用!
Aug 09 Javascript
简单理解vue中track-by属性
Oct 26 Javascript
JavaScript实现格式化字符串函数String.format
Dec 16 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
Mar 14 Javascript
原生js实现简单的Ripple按钮实例代码
Mar 24 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
详解vue.js下引入百度地图jsApi的两种方法
Jul 27 Javascript
在create-react-app中使用css modules的示例代码
Jul 31 Javascript
jQuery的Ajax接收java返回数据方法
Aug 11 jQuery
VUE写一个简单的表格实例
Aug 06 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
Sep 18 Javascript
WebWorker 封装 JavaScript 沙箱详情
Nov 02 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 和 XML: 使用expat函数(二)
2006/10/09 PHP
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
jQuery实现跨域
2015/02/03 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
微信小程序 按钮滑动的实现方法
2017/09/27 Javascript
浅谈node的事件机制
2017/10/09 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
Python中print函数简单使用总结
2019/08/05 Python
python的数学算法函数及公式用法
2020/11/18 Python
Python: glob匹配文件的操作
2020/12/11 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
办公室文秘自我评价
2013/09/21 职场文书
工作决心书范文
2014/03/11 职场文书
校园活动宣传方案
2014/03/28 职场文书
2014组织生活会方案
2014/05/19 职场文书
经典毕业生求职信
2014/07/12 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
父亲节活动策划方案
2014/08/24 职场文书
创业计划书之水果店
2019/07/18 职场文书
python控制台打印log输出重复的解决方法
2021/05/14 Python