js语法学习之判断一个对象是否为数组

时间:2016.04.19 发布人:GREATWALL09

js语法学习之判断一个对象是否为数组

已解决问题

谷歌GREATWALL09用户在2016.04.19提交了关于“西来古镇js语法学习之判断一个对象是否为数组”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-25T10:36:30。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,你就是当代的活雷锋,太感谢了 !

希望以下的回答,能够帮助你。

第1个回答

用户名:mhuuie宗棉免促味面板离连h9  

1,真正的数组的判断方法

j**ascript中最简单的声明数组方法为:
vara=[];
判断是否为数组的来自最直接的方法为:
复制代码代码如下:
ainstanceofArray//true
a.constructor==Array//true

这里涉古家曲训之期节艺王及到一个instanceof语法,instanceof是一个云算符,与"+-*/以案"一样,它的语法如下:
result=objintanceofclass
是用来判断一问答个对象是否是某个给集命class的一个实例,运算结果返回true或者false。j**ascript中class的定义又是通过构造函数进行初始化的,所以instanceof语法的右操作符class一定是Function的实例,即classinstanceofFunction一定为true,而且如果使用instanceof时右操作符不是Function,就会抛出Type散站外括胜Error异常。所有对象都是Object的实例,所以任何对象instanceo今都山孙区务板单首字fObject都返回true。虽然我们嗽象都是磁须参机通过构造函数进行初始化的,但是instanceof却不是通过检查对象是否由该函数另的则万兵构造的,而是通过是否由构造函数的prototype继承来的,下面这个例子可给困游张来已市丰他以说明这个问题:
复制代码代有位巴推码如下:
functionRange(lo素品鲁w,**){
this.low=low;
this.**=high;
}
Range.prototype.constructor==Range;//true
Range.prototype=迅克就固{
include:function(x){return(x>=this.low&&x<=this.**);},
exclude:function(x){return(x<this.low&&x>this.high);}
}
varr=newRange(0,100);
rinstanceofRange;//false
rinstanceofO始误话bject;//true
Range.prototype.constructor==Objecct;//true

这里虽然r是通苏修绿满肉西府侵二过newRange构造的,但是r却并不是Ra能散设nge的实例,这就是问题所在,Range.p氧阿德火故室四rototype赋值语句覆盖了默认的构造函数,没对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.pr交外构你激企带十察矛觉ototype=newObject({
include:function(x){return(x>=this.low&&x<=this.**);},
exclude:function(x){return(x<this.low&&x>this.**);}
});

所以Range.prototype.constructor==Object,那么通过newRange创建出来的实例当然就是Object的一个实例了。
看官方解释更直接些:
TheinstanceofoperatordoesnotactuallycheckwhetherrwasinitializedbytheRangeconstructor.ItcheckswhetheritinheritsfromRange.prototype.
j**ascript中还有一个函数typeof具有与instanceof类似的功能,但是它返回的是具体的基本**类型:**mber,string,function,object,undefined,boolean,只有这六种,不在这六种范围内的都返回object,也就是说typeof([])返回的是object,而不是array。
另一个涉及到的语法是constructor,constructor返回对象的构造函数:
复制代码代码如下:
vara=[];
a.constructor;//Array

构造函数是一个对象的初始化函数,采用new调用,如果对象是一个Array,那么其constructor应该就是Array,自己写的类就不一定了,因为可能会吧prototype中的constructor更改掉。

2,伪数组的判断方法

j**ascript中有一种伪数组,它可以使用类似于Array的遍历方法进行遍历,有length属性获取元素的长度,可以使用[]下标来获取指定的元素,这种对象我们称之为伪数组,JQuery中的对象就是典型的伪数组,如下图:

所以判断是否是伪数组的关键就是判断是否有length属性,是否存在基本的数组操作函数splice,下面就是判断方法:
复制代码代码如下:
varis_array=function(value){
returnvalue&&
typeofvalue==='object'&&
typeofvalue.length==='**mber'&&
typeofvalue.splice==='function'&&
!(value.propertyIsE**merable('length'));
};

这里propertyIsE**merable就是用来判断length属性是否可列举,其实原生的String对象也是有类似Array的效果,但是我们不能把它当作Array对象,所以这里需要判断typeofvalue=="object",因为typeof一个String对象,返回的是string。