js判断一个对象是否为数组
1,真正的数组的判断方法
javascript中最简单的声明数组方法为:
var a = [];
判断是否为数组的最直接的方法为:
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继承来的,下面这个例子可以说明这个问题:
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,这也好理解,因为
include: function(x){ return (x >= this.low && x <= this.high); },
exclude: function(x){ return (x < this.low && x > this.high); }
}
其实等价于:
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返回对象的构造函数:
a.constructor; //Array
构造函数是一个对象的初始化函数,采用new调用,如果对象是一个Array,那么其constructor应该就是Array,自己写的类就不一定了,因为可能会吧prototype中的constructor更改掉。
2,伪数组的判断方法
javascript中有一种伪数组,它可以使用类似于Array的遍历方法进行遍历,有length属性获取元素的长度,可以使用[]下标来获取指定的元素,这种对象我们称之为伪数组,JQuery中的对象就是典型的伪数组,如下图:
所以判断是否是伪数组的关键就是判断是否有length属性,是否存在基本的数组操作函数splice,下面就是判断方法:
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。
来自:http://www.jb51.net/article/50056.htm
js判断一个对象是否为数组的更多相关文章
- 如何用js判断一个对象是不是Array
.如何用js判断一个对象是不是Array 1.Array.isArray(obj) 调用数组的isArray方法 2.obj instanceof Array 判断对象是否是Array的实例 3.Ob ...
- 使用js判断一个对象是否为空 比如 obj={}
今天使用到js判断一个对象是否为空,js没有封装好的方法,这里最好的办法就是使用jquery里面的封装好的方法 $.isEmptyObject(obj)
- JS——判断一个对象是否为空
判断一个对象是否为空对象,本文给出三种判断方法: 1.最常见的思路,for...in...遍历属性,为真则为"非空数组":否则为"空数组" 2.通过JSON自带 ...
- js判断一个对象{}是否为空对象,没有任何属性
// js如何判断一个对象{}是否为空对象,没有任何属性 if (typeof model.rows === "object" && !(model.rows in ...
- JS判断元素是否在数组内
//判断元素是否在数组内 function contains(arr, obj) { var i = arr.length; while (i--) { if (arr[i] === obj) { r ...
- js判断一个变量是数组还是对象
判断变量是数组还是对象,使用Object.prototype.toString.call(),兼容性好,切勿使用typeof来判断对象或者数组,因为typeof得到的都是object: functio ...
- js判断对象是否为数组
1.ECMAScript5中有一个现成的方法:Array.isArray(). var obj = {1:[1],2:[2]}, arr = [1], str = "1"; Arr ...
- Js判断对象是否是数组的方法
1.ECMAScript5中有一个现成的方法:Array.isArray(). var obj = {1:[1],2:[2]}, arr = [1], str = "1"; Arr ...
- js判断字符串是否在数组中
先加一个扩展函数: Array.prototype.contains = function (obj) { var index = this.length; while (index–) { ...
随机推荐
- leetcode 493 Reverse Pairs
题意:给定一个数组nums,求若 i<j and nums[i] > 2*nums[j] 的逆序对. Note: 数组的长度不会超过50,000 不愧是hard模式的题目,虽然已经知道可以 ...
- HDU 6301 (贪心+优先队列)
题目大意: 求一个长度为n的数列, 给出m个区间,这m个区间各自区间内的数不同 题解: 用优先队列来模拟过程 , 解题思路是想到了 , 可是不知道如何实现 , 果然还须继续努力呀 这道题思路是去掉重复 ...
- HDU - 1907 anti-SG
题意:nim游戏,最后取光为[输] anti-SG的应用,搬运一下我的摸鱼小笔记 最先看到的应该是分奇偶的非充裕堆判断,若为偶数则先手胜,否则后手胜 按SG分类 SG!=0时 1.只有一堆大于1,先手 ...
- POJ - 3764 01字典树+前缀异或和
异或关于前缀的特性:[u,v]=[1,u]^[1,v] 注意是路径,假设1为根,prexor[1]不保留数值 /*H E A D*/ int to[maxn<<1],nxt[maxn< ...
- PIE SDK打开Micaps数据
1. 功能简介 Micaps数据是气象信息处理和天气预报制作中的一种气象数据格式.其包含多种气象信息产品(地面常规气象观测数据产品.高空常规气象观测数据产品等),目前Micaps数据被Micaps软件 ...
- Python max 和 min高级用法
zip max 比较一个字典,是按key比较 如果想比较字典的value max比较只能是相同类型,比如字符串和数字就不能比较会报错 这种会报错
- Unable to connect to data source (DSN: shangjihuiclient; Network Address: ; Port Number: 53397). Cannot connect to TimesTen Server. Verify that the TimesTen Server is running or verify that your TCP PORT is set correctly.
安装完毕TimesTen后,在客户端连接时一直报错. 解决办法是:重启服务器,在连接没在报这个错误.
- spark on yarn模式里需要有时手工释放linux内存
为什么要提出这个问题? spark跑YARN模式或Client模式提交任务不成功(application state: ACCEPTED) 然后执行 [spark@master spark--bin- ...
- unet知识点
https://www.bilibili.com/video/av8483444/?from=search&seid=17755425906400905363 https://www.jian ...
- Mixamo Fuse10分钟创建角色
http://edu.manew.com/course/132 太6了