建议49:比较数组与对象同源特性
我们常常将对象和数组作为不同的数据类型来处理,这是一种有用且合理的简化,通过这种处理可以在大多数的JavaScript程序设计中将对象和数组作为单独的类型来处理。要完全掌握对象和数组的行为,还必须了解数组不过是一个具有额外功能层的对象。使用typeof运算符时就会发现这一点,因为将其作用于一个数组的值,返回值是字符串“object”。
数组是一段线性分配的内存,它通过整数去计算偏移并访问其中的元素。数组可以是访问速度很快的数据结构。不幸的是,JavaScript没有数组这样的数据结构。相反,JavaScript提供了一种拥有一些类数组(array-like)特性的对象,把数组的下标转变成字符串,将其作为属性。这类对象的访问速度明显比真正数组慢,但它使用更方便。属性的检索和更新方式与对象一模一样。数组有它自己的字面量格式,还有一套非常有用的内置方法。
(1)数组字面量
数组字面量提供了一种非常方便地创建新数组的表示法。一个数组字面量是在一对方括号中包围零个或多个用逗号分隔的值的表达式。数组字面量可以出现在任何表达式可以出现的地方。数组的第一个值将获得属性名“0”,第二个值将获得属性名“1”,依此类推。
var empty = [];
var numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
empty[1] // undefined
numbers[1] // 'one'
empty.length // 0'
numbers.length //10
(2)对象字面量
var numbers_object = {
'0' : 'zero',
'1' : 'one',
'2' : 'two',
'3' : 'three',
'4' : 'four',
'5' : 'five',
'6' : 'six',
'7' : 'seven',
'8' : 'eight',
'9' : 'nine'
};
产生了一个与前面的方法相似的结果。numbers和numbers_object都是包含10个属性的对象,并且这些属性刚好有相同的名字和值。但numbers和numbers_object也有一些显著的不同,numbers继承自Array.prototype,而numbers_object继承自Object.prototype,所以numbers继承了大量有用的方法。同时,numbers有一个length属性,而numbers_object则没有。
在大多数语言中,一个数组的所有元素都要是相同的类型,而JavaScript允许数组包含任意混合类型的值。
var misc = ['string', 98.6, true, false, null, undefined, ['nested', 'array'], {
object : true
}, NaN, Infinity];
misc.length