为什么对象数组被视为对象而不是数组?例如:
$.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
}
});
答案 0 :(得分:201)
Javascript中奇怪的行为和规范之一是typeof数组是Object
。
您可以通过以下几种方式检查变量是否为数组:
var isArr = data instanceof Array;
var isArr = Array.isArray(data);
但最可靠的方法是:
isArr = Object.prototype.toString.call(data) == '[object Array]';
由于您使用jQuery标记了您的问题,因此您可以使用jQuery isArray
函数:
var isArr = $.isArray(data);
答案 1 :(得分:23)
引用规范
Array对象对某类属性名称进行特殊处理。当且仅当ToString(ToUint32(P))等于P且ToUint32(P)不等于2 ^ 32-1时,属性名P(以String值的形式)是数组索引。属性名称为数组索引的属性也称为元素。每个Array对象都有一个length属性,其值始终是小于2 ^ 32的非负整数。 length属性的值在数值上大于名称为数组索引的每个属性的名称;无论何时创建或更改Array对象的属性,都会根据需要调整其他属性以保持此不变量。具体来说,每当添加名称为数组索引的属性时,如果需要,将更改length属性,使其大于该数组索引的数值;每当更改length属性时,将自动删除名称为数值索引且值不小于新长度的每个属性。此约束仅适用于Array对象的自身属性,并且不受可能从其原型继承的长度或数组索引属性的影响。
这是typeof
要添加一些背景,JavaScript中有两种数据类型:
JavaScript中的对象在结构上类似于在大多数面向对象语言中看到的关联数组/字典 - 即,它具有一组键值对。
可以将数组视为具有以下属性/键的对象:
希望这有助于更清楚地说明typeof Array返回对象的原因。干杯!
答案 2 :(得分:5)
试试这个例子,你也会理解“关联数组”和“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返回一个Object ...可以返回一个关联数组......但它不像那样
答案 3 :(得分:-7)
您的代码中没有普通的JS数组。 data
是本机JS对象。
请注意不同类型括号的不同含义:
var someArray = [];
var someObject = {};