可能重复:
JavaScript:检查对象是否为数组?
为什么将对象数组视为对象而不是数组?例如:
$.ajax({
url: 'http://api.twitter.com/1/statuses/user_timeline.json',
data: { screen_name: 'mick__romney'},
dataType: 'jsonp',
success: function(data) {
console.dir(data); //Array[20]
alert(typeof data); //Object
}
});
javascript的怪异行为和规范之一就是Array is Object
。
您可以通过以下几种方法检查变量是否为数组:
var isArr = data instanceof Array;
var isArr = Array.isArray(data);
但是最可靠的方法是:
isArr = Object.prototype.toString.call(data) == '[object Array]';
由于您使用jQuery标记了问题,因此可以使用jQueryisArray
函数:
var isArr = $.isArray(data);
引用规格
15.4数组对象
数组对象对某些类别的属性名称给予特殊对待。当且仅当ToString(ToUint32(P))等于P并且ToUint32(P)不等于2 ^ 32-1时,属性名称P(以字符串值的形式)是数组索引。属性名称是数组索引的属性也称为元素。每个Array对象都有一个length属性,其值始终是小于2 ^ 32的非负整数。length属性的值在数值上大于名称为数组索引的每个属性的名称;每当创建或更改Array对象的属性时,都会根据需要调整其他属性以保持该不变性。具体地说,每当添加一个名称为数组索引的属性时,如果需要,将length属性更改为比该数组索引的数值大一的值;并且只要更改length属性,就会自动删除名称为数组索引且其值不小于新长度的每个属性。此约束仅适用于Array对象自身的属性,不受可能从其原型继承的长度或数组索引属性的影响。
这是一张桌子 typeof
为了增加一些背景,JavaScript中有两种数据类型:
- 原始数据类型-包括null,undefined,string,boolean,number和object。
- 派生数据类型/特殊对象-这些包括函数,数组和正则表达式。是的,这些都是从JavaScript中的“对象”派生的。
JavaScript中的对象在结构上类似于大多数面向对象的语言中看到的关联数组/字典-即,它具有一组键值对。
数组可以被认为是具有以下属性/键的对象:
- 长度-可以为0或更大(非负)。
- 数组索引。这样,我的意思是“ 0”,“ 1”,“ 2”等都是数组对象的属性。
希望这有助于阐明为什么typeof Array返回对象。干杯!
试试这个例子,您还将了解JavaScript中的关联数组和对象之间的区别。
关联数组
var a = new Array(1,2,3);
a['key'] = 'experiment';
Array.isArray(a);
退货 true
请记住,这a.length
将是未定义的,因为length
它被视为键,因此应使用它Object.keys(a).length
来获取关联数组的长度。
目的
var a = {1:1, 2:2, 3:3,'key':'experiment'};
Array.isArray(a)
退货 false
JSON返回一个对象...可能返回一个关联数组...但事实并非如此
您的代码中没有普通的JS数组。本data
是土生土长的JS对象。请注意不同类型括号的不同含义:
var someArray = [];
var someObject = {};
文章标签:arrays , javascript , jquery , object , typeof
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!