blog icon indicating copy to clipboard operation
blog copied to clipboard

Array对象与Object对象的区别

Open jackiewillen opened this issue 6 years ago • 0 comments

Array对象与Object对象的区别

作者:殷荣桧@腾讯

先来看两张图: 先看一个数组的数组打印出来是什么样的: ![](https://raw.githubusercontent.com/jackiewillen/blog/master/images/array%E4%B8%8Eobject%E5%9B%BE1.png)

接下来将对象打印出来:

其实你会发现,两者只有一个差别:就是一个有length属性,一个没有

1.先来讨论除了length之外的一些差别:

其实数组也可以这样定义:

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

接下来再看一下object的定义
var myObject = {'A': 'Athens', 'B':'Berlin'};

那定义完数据后访问也没有差别: 数组和对象都可以通过myArray.A来访问。但并不是每种情况都是这样,比如:

前面的var b={1:1,2:2,3:3,4:4};那么用b.1访问就会出错:

出现这个错误的问题是通过.来访问的只能是对象的非数字属性。数字属性的只能用a[1]这样来访问。

所以出现了差异一:

有序的常用数组,无序的常用对象。其实除了Array多提供了一些函数(如:join之类的)几乎就没有其它的区别

2.那么接下来就谈length了。

length有哪些特性呢: (1)其值是取array中的数值最大的加一,如果没有数值,像上面的var myArray = Array();myArray['A'] = "Athens";myArray['B'] = "Berlin";这样定义数组的话,那么就是myArray.length的长度就是0了。因为找不到数字属性名; (2)length是可以改动的,但什么数值都是可以改的吗?答案是不可以改成负数和大于2^32-1的数。

如果输入的是此类数据,则会报错。

那如果输入的数小于数组的长度呢?比如:

a[0]=0;
a[1]=1
a[2]=2;
a[3]=3;

如果设定了a.length=2时,那么这个时候电脑内存中只剩下了a[0],a[1]了。

那么如果是这样呢?

a[0]=0;
a[1]=1
a[2]=2;
a[3]=3;
a['father']='yin';

此时如何设定a.length=2呢,那么这个时候电脑内存中只剩下了a[0],a[1],['father']='yin';了。因为其实a.length只会调整数值类型的数字的内存空间。如下:

(3)length是假的,我不知道为什么javascript为什么要把它做成这样,比如:

var a=[];
a[100]=1;

那么这个时候a.length就是101;如下图:

javascript中的length其实就是找到数值最大的那个加1,所以length其实是假的,所以属性数值不连续时不要使用length来测量数据长度。

这些是Ecmascript标准中定义的,所以只能遵守。

参考资料:

https://stackoverflow.com/questions/874205/what-is-the-difference-between-an-array-and-an-object http://blog.csdn.net/ltx06/article/details/53375340

jackiewillen avatar Oct 20 '18 09:10 jackiewillen