JavaScript语言精粹读书笔记- 数组

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

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

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

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

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

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

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

[b]纬度[/b]:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值