blog
blog copied to clipboard
Array对象与Object对象的区别
Array对象与Object对象的区别
作者:殷荣桧@腾讯
先来看两张图:
先看一个数组的数组打印出来是什么样的:

接下来将对象打印出来:
其实你会发现,两者只有一个差别:就是一个有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