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

2022-08-30 00:51:06

可能的重复:
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
    }
});​

小提琴


答案 1

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

答案 2

引用规范

15.4 数组对象

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

这是一张桌子typeof

enter image description here


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

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

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

可以将数组视为具有以下属性/键的对象:

  1. 长度 - 这可以是 0 或更高(非负数)。
  2. 数组索引。我的意思是“0”,“1”,“2”等都是数组对象的属性。

希望这有助于阐明为什么 typeof Array 会返回一个对象。干杯!