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

Joh*_*han 130 javascript arrays jquery typeof object

可能重复:
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
    }
});?
Run Code Online (Sandbox Code Playgroud)

小提琴

gdo*_*ica 215

Javascript中奇怪的行为和规范之一是typeof Array Object.

您可以通过以下几种方式检查变量是否为数组:

var isArr = data instanceof Array;
var isArr = Array.isArray(data);
Run Code Online (Sandbox Code Playgroud)

但最可靠的方法是:

isArr = Object.prototype.toString.call(data) == '[object Array]';
Run Code Online (Sandbox Code Playgroud)

由于您使用jQuery标记了您的问题,因此您可以使用jQuery isArray函数:

var isArr = $.isArray(data);
Run Code Online (Sandbox Code Playgroud)

  • @Alex,是的,如果你正在检查你从`<iframe>`获得的数组,那么另一个可以给你`false`. (10认同)
  • 换句话说,`typeof`永远不会返回"数组"? (7认同)
  • "但最可靠的方式是:......"所以你提出的其他方式是不可靠的? (7认同)
  • @gdoron MDN似​​乎表明`Array.isArray(...)`应该是可靠的https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof#instanceof_and_multiple_context_(eg_frames_or_windows)? (5认同)
  • @m,你是对的,但旧版浏览器不支持.[见这里](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray#Browser_compatibility) (2认同)

Pri*_*orn 25

引用规范

15.4数组对象

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

这是一张桌子 typeof

在此输入图像描述


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

  1. 基元数据类型 - 包括null,undefined,string,boolean,number和object.
  2. 派生数据类型/特殊对象 - 包括函数,数组和正则表达式.是的,这些都来自JavaScript中的"对象".

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

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

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

希望这有助于更清楚地说明typeof Array返回对象的原因.干杯!

  • 根据以下内容,对象不是原始的:https://developer.mozilla.org/en-US/docs/Glossary/Primitive (4认同)

Ref*_*ive 6

试试这个例子,您也将了解JavaScript中的关联数组和对象之间的区别.

关联数组

var a = new Array(1,2,3); 
a['key'] = 'experiment';
Array.isArray(a);
Run Code Online (Sandbox Code Playgroud)

回报 true

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

宾语

var a = {1:1, 2:2, 3:3,'key':'experiment'}; 
Array.isArray(a)
Run Code Online (Sandbox Code Playgroud)

回报 false

JSON返回一个Object ...可以返回一个关联数组......但它不是那样的