为什么带有对象的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:
- 原始数据types – 这包括null,undefined,string,布尔值,数字和对象。
- 派生数据types/特殊对象 – 包括函数,数组和正则expression式。 是的,这些都是从JavaScript中的“Object”派生的。
JavaScript中的对象在结构上与大多数面向对象语言中的关联数组/字典类似,即它具有一组键值对。
数组可以被认为是具有以下属性/键的对象:
- 长度 – 可以是0或以上(非负)。
- 数组索引 。 由此,我的意思是“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 = {};