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

IT技术 javascript jquery arrays object typeof
2021-01-27 01:56:51

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

小提琴

3个回答

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

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

var isArr = data instanceof Array;
var isArr = Array.isArray(data);

但最可靠的方法是:

isArr = Object.prototype.toString.call(data) == '[object Array]';

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

var isArr = $.isArray(data);
@m,您说得对,但旧浏览器不支持。看这里
2021-03-18 01:56:51
所以换句话说,typeof永远不能返回“数组”?
2021-03-24 01:56:51
@gdoron MDN 似乎表明Array.isArray(…)应该是可靠的developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-27 01:56:51
“但最可靠的方法是:……” 所以你建议的其他方法都不可靠?
2021-04-02 01:56:51
@Alex,是的,false如果您正在检查从<iframe>.
2021-04-07 01:56:51

引用规范

15.4 数组对象

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

这是一张桌子 typeof

在此处输入图片说明


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

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

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

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

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

希望这有助于更多地了解 typeof Array 返回对象的原因。干杯!

根据以下内容,对象不是原始的:developer.mozilla.org/en-US/docs/Glossary/Primitive
2021-03-19 01:56:51

试试这个例子,你也会明白 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 返回一个对象......可以返回一个关联数组......但它不是那样的

JSON 中没有所谓的关联数组。但我不确定你在回答这个问题时想说什么。
2021-03-14 01:56:51
这家伙将他的数据定义为 { ... } - Object ... 我试图向他解释 b/w 关联数组和对象的区别。实际上他检查服务器返回的日期,所以它不一样......但可能你是对的......应该检查它:)
2021-03-19 01:56:51
JSON 也有数组的概念。(并且数组索引从 0 开始。)
2021-04-04 01:56:51
恕我直言,JavaScript 中有一种叫做关联数组的东西......检查它......这就是我试图解释的......当你调用isArray. 例如,关联数组是 Perl 中的 HASH 或通常称为字典。JSON 没有这种表示形式..所以关联数组被视为具有属性的对象。
2021-04-05 01:56:51
你能举一个 JSON 关联数组的例子吗?类似的东西:jQuery.parseJSON('{"name":"John"}')...这个通常被接受为一个对象。您认为 JSON 如何表示关联数组?
2021-04-08 01:56:51