日期:2014-05-16  浏览次数:20353 次

JavaScript语言精粹读书笔记- 数组
数组Arrays
数组是一段线性分配的内存,它通过整数去计算偏移并访问其中元素。数组可以是很快的数据结果。不幸的是,JavaScript没有像这种数组一样的数据结果。
反而,JavaScript提供了一种拥有一些类数组(array-like)特性的对象。它把数组的下标转变成字符串,用其作为属性。它明显比一个真正的数组慢,但它可以更方便地使用。属性的检索和更新的方式与对象一模一样,除了有一个可以用整数作为属性名的特性外。数组有它们自己的字面量格式。

数组字面量Array Literals
var empty = [];
var numbers = [0,1,2];    // 数组字面量
var numbers_object = {‘0’ : 0,’1’ : 1, ‘2’ : 2};  // 对象字面量
上面的数组字面量numbers和对象字面量numbers_object产生了一个相似的结果。numbers和numbers_object都是包含3个属性的对象,并且那些属性刚好有相同的名字和值。但是它们也有一些显著的不同。numbers继承自Array.prototype,而numbers_object继承自Object.prototype,所以numbers继承了大量有用的方法。同时,numbers有一个诡异的属性length,而numbers_object没有。
在大多数语言中,一个数组的所有元素都要求是相同的类型。JavaScript允许数组包含任意混合类型的值。

长度Length
每个数组都有一个length属性。和大多数其他语言不同,JavaScript数组的length是没有上界的。如果你用大于或者等于当前length的数字作为下标来保存一个元素,那么length将增大来容纳新元素。不会发生边界错误。
length属性的值是这个数组的最大整数属性名加上1。它不一定等于数组里的属性的个数。
var myArray = [];
myArray.length  // 0
myArray[100] = true;
myArray.length //101 但是myArray只包含一个属性。

删除Delete
由于JavaScript数组其实就是对象,所以delete运算符可以用来从数组中移除元素。
delete numbers[1];   // [0,undefined,2]
不幸的是,那样会在数组中遗留一个空洞。这是因为排在被删除元素之后的元素保留了它们最初的名字(下标)。而你通常想要的是递减后面每个元素的名字(下标)。可以通过splice(序号,删除元素个数)来实现想要的删除效果。

枚举Enumeration
因为JavaScript的数组其实就是对象,所以可以用for in 语句来遍历一个数组的所有属性。不幸的是,for in 无法保证属性的顺序,而大多数的数组应用都期望按照阿拉伯数字顺序来产生元素。此外,可能从原型链中得到意外属性的问题依旧存在

混淆的地方
在JavaScript编程中,一个常见的错误是在须使用数组时使用了对象,或者在须使用对象时使用了数组。其实规则很简单:当属性名小而连续的整数时,你应该使用数组。否则,使用对象
JavaScript本身对于数组和对象的区别是混乱的。typeof运算符报告数组的类型是’object’,这没有意义。

方法Method
JavaScript提供了一套作用与数组的方法。这些方法是被存储在Array.prototype中的函数。同时所有给Object.prototype扩充的方法,由于原型链的存在,Array对象也能使用。
通过给Array.prototype扩充一个函数,每个数组都继承了这个方法。
同时因为数组其实就是对象,我们也可以直接给一个单独的数组添加方法
data = []; data.say = function(){alert(1);}; data.say();
因为字符串say不是整数,所以给数组增加一个say属性不会改变它的长度。当属性名是整数时,数组才最有用,但它们依旧是对象,并且对象可以接受任何字符串作为属性名。

纬度