为什么带有对象的typeof数组返回“Object”而不是“Array”?

可能重复:
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中的奇怪的行为和规范之一是arrays是Object

你可以用几种方法检查variables是否是一个数组:

 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); 

引用规范

15.4数组对象

数组对象对特定类的属性名称给予特殊的处理。 当且仅当ToString(ToUint32(P))等于P且ToUint32(P)不等于2 ^ 32-1时,属性名称P(以string值的forms)才是数组索引。 属性名称是数组索引的属性也称为元素。 每个数组对象都有一个长度属性,其值始终是一个小于2 ^ 32的非负整数。 length属性的值在数值上大于名称为数组索引的每个属性的名称; 每当一个数组对象的属性被创build或更改,其他属性将根据需要进行调整以保持不变。 具体来说,无论何时添加一个名称为数组索引的属性,如果需要,length属性将被更改为比该数组索引的数值多一个; 并且每当length属性发生更改时,将自动删除名称为数组索引且其值不小于新长度的数组索引。 此约束仅适用于Array对象的属性,并且不受可能从原型inheritance的长度或数组索引属性的影响。

这里是一个typeof

在这里输入图像说明


为了添加一些背景,JavaScript中有两种数据types:

  1. 原始数据types – 这包括null,undefined,string,布尔值,数字和对象。
  2. 派生数据types/特殊对象 – 包括函数,数组和正则expression式。 是的,这些都是从JavaScript中的“Object”派生的。

JavaScript中的对象在结构上与大多数面向对象语言中的关联数组/字典类似,即它具有一组键值对。

数组可以被认为是具有以下属性/键的对象:

  1. 长度 – 可以是0或以上(非负)。
  2. 数组索引 。 由此,我的意思是“0”,“1”,“2”等是数组对象的全部属性。

希望这有助于揭示为什么typeof数组返回一个对象。 干杯!

试试这个例子,你也会明白JavaScript中的关联数组和对象有什么不同。

关联数组

 var a = new Array(1,2,3); a['key'] = 'experiment'; Array.isArray(a); 

返回true

请记住,a.lenth将是未定义的,因为长度被视为一个关键,您应该使用Object.keys(a).length来获得关联数组的长度。

目的

 var a = {1:1, 2:2, 3:3,'key':'experiment'}; Array.isArray(a) 

返回false

JSON返回和对象…可以返回一个关联数组…但它不是这样的

你的代码中没有普通的JS数组。 data是一个本地的JS对象。 注意不同types括号的不同含义:

 var someArray = []; var someObject = {};