为什么带有对象的typeof数组返回&;object&;而不是“数组”?

< p > 可能的重复: < br > JavaScript:检查对象是否是数组? < / p >

为什么对象数组被认为是对象,而不是数组?例如:

$.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
}
});​

小提琴

179597 次浏览

Javascript中一个奇怪的行为和规范是typeof Array是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);

引用说明书

15.4数组对象

数组对象对特定类型的属性名给予特殊处理。属性名P(以String值的形式)是数组索引当且仅当ToString(ToUint32(P))等于P且ToUint32(P)不等于2^32-1。属性名为数组索引的属性也称为元素。每个Array对象都有一个length属性,其值总是小于2^32的非负整数。length属性的值在数字上大于每个名称为数组索引的属性的名称;每当Array对象的一个属性被创建或改变时,其他属性都会根据需要进行调整,以保持这个不变量。具体来说,每当添加一个名称为数组索引的属性时,length属性将被更改(如果需要的话),使其比该数组索引的数值大1;每当length属性被更改时,每个名称为数组索引且值不小于新长度的属性都会被自动删除。此约束仅适用于Array对象自身的属性,不受可能从其原型继承的长度或数组索引属性的影响。

这里是typeof的表

enter image description here


添加一些背景信息,JavaScript中有两种数据类型:

  1. 原始数据类型 -这包括空,未定义,字符串,布尔,数字和对象。
  2. 派生数据类型/特殊对象 -这些包括函数,数组和正则表达式。是的,这些都源自JavaScript中的“Object”。

JavaScript中的对象在结构上类似于大多数面向对象语言中的关联数组/字典——也就是说,它有一组键值对。

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

  1. 长度 -可以是0或以上(非负)。
  2. 数组下标。我的意思是,“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返回Object…可以返回一个关联数组…但事实并非如此