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

2020/10/26 15:02 · javascript ·  · 0评论

可能重复:
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的怪异行为和规范之一就是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);

引用规格

15.4数组对象

数组对象对某些类别的属性名称给予特殊对待。当且仅当ToString(ToUint32(P))等于P并且ToUint32(P)不等于2 ^ 32-1时,属性名称P(以字符串值的形式)是数组索引。属性名称是数组索引的属性也称为元素。每个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返回对象。干杯!

试试这个例子,您还将了解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返回一个对象...可能返回一个关联数组...但事实并非如此

您的代码中没有普通的JS数组。data是土生土长的JS对象。请注意不同类型括号的不同含义:

var someArray = [];
var someObject = {};
本文地址:http://javascript.askforanswer.com/weishenmedaiyouduixiangdetypeofshuzufanhuiduixiangerbushishuzuzhongfu.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!