JavaScript之数组

来源:互联网 发布:windows xp ping不通 编辑:程序博客网 时间:2024/06/03 19:30

概述

JavaScript数组的索引是基于零的32位数值,第一个元素的索引为0,最多可能的索引为(2^32-2),针对稀疏矩阵,length比所有元素的索引都大


创建数组

数组直接量的语法允许有可选的结尾逗号,故[,,]只有两个元素

new Array(10)  //长度为10的空数组

数组元素的读和写

数组是对象的特殊形式


所有的索引都是属性吗,但只有0~2^ 32-2之间的整数属性名才是索引。所有的数组都是对象,可以为其创建人意名字的属性。但如果使用的属性是数组的索引,则会根据需要更新其length值

可以使用附属或非整数来索引数组,这种情况下,数值转换为字符串然后当属性名来用,这样就是常规的对象属性,而不是数组的索引。同样,如果是使用了非负整数的字符串,就当作数组索引,而非对象索引。当使用一个浮点数和一个整数相等时情况也一样。


事实上数组索引仅仅是对象属性名的一种特殊类型,这意味着JavaScript数组没有越界错误。当试图查找不存在的属性,返回undefined


当一个数组缺失继承了元素或者使用了元素的getter和setter方法,则很可能使用非优化路径(类似于常规对象查找)


稀疏矩阵

若矩阵为稀疏,则length大于元素个数


足够稀疏的数组通常在实现上比稠密的数组更慢、内存利用率更高,在这样的数组中查找元素的时间与常规对象属性的查找时间一样长

当在数组直接量中省略值时不会产生稀疏数组——省略的元素值为undefined,而不是不存在


数组长度

每个数组有一个length,就是这个属性时期区别于常规的JavaScript对象


当数组是稀疏的时,length属性值大于元素的个数。而且关于此可以说一切也就是数组长度必然大于任意一个索引值。


当length设置为一个小于当前长度的非负整数n时,当前数组中国年那些索引值大于等于n的元素将被删除,


数组元素的添加和删除

delete操作并不影响数组长度,而数组进行delete操作,就会变为稀疏数组


数组遍历

通常数组元素的便利是生序的,但不必然如此。

当一个数组同时拥有对象属性和数组元素,返回的属性名很可能是按照创建顺序而不是数值的大小顺序


多维数组

JavaScript不支持真正的多维数组,但可以用数组的数组来近似


数组方法

Array.join()方法是String.split()方法的逆向操作,后者是将字符串分割成若干块来创建一个数组


Array.reverse()方法将数组中的元素点到顺序,返回逆序的数组。它采取了替换;换句话说,他不通过重新排列的元素创建新的数组,而是在原先的数组中重新排列(改变原数组)


不带参数的sort调用sort()时,数组元素以字幕版顺序排序(如果需要会转化为字符串比较)

若数组包含undefined元素,则会被拍到数组尾部

为了按照其他方式而非字母表顺序进行数组操作,必须给sort传入一个比较函数(返回一个数值,大于0则是a>b)


concat不会递归扁平化数组的数组

x=[1,2,3].concat(4,[4,[7,3]])//(6) [1, 2, 3, 4, 4, Array(2)]


splice如果省略第二个参数,则从起始点到数组结尾所有元素都被删除,splice返回一个被删除的数组,若干没有删除元素则返回空数组

区别于concat,splice会插入数组本身而不是数组的元素


unshift()返回数组长度

shift()返回删除的元素

当使用多个参数调用unshift()时它的行为令人惊讶,参数时一次性插入。


数组的toString()方法会将每个元素都变为字符串,和不加任何参数的join是一样的


ES5中的数组方法

如果是稀疏数组,对不存在的元素不调用传递的函数。在大多数情况下,调用提供的函数使用3个参数:数组元素,元素的索引和数组本身。大多数ES5数组的方法的第一个参数是函数,第二个参数是可选的。如果有第二个参数,则调用的函数被看作是第二个参数的调用方法,也就是说第二个参数作为this


forEach()无法在所有元素传给函数前就终止遍历,若要强行终止,只能选择抛出异常。

map()返回的是新数组:它修改调用数组,如果原数组是稀疏数组,返回的也是相同方式的稀疏数组。


filter()会跳过稀疏数组中缺少的元素,其返回值总是稠密的。为了压缩稀疏数组的空缺,可以直接返回true


一旦every()或some()确认该返回什么值她们就会停止遍历数组元素。根据数学上的惯例,在空数组上调用时,every()返回true,some()返回false


化简函数的任务就是通过把两个值组合或化简为一个值,并返回化简后的值。第二个(可选)参数时传递给函数的初始值。


reduce()函数的数组元素、元素索引和数组本身将作为第2-4的参数传入,第一个为截止目前的化简值。

在空数组上,不带初始值参数调用reduce()将导致类型错误异常。如果调用的时候只有一个值——数组只有一个元素且无初始值或数组为空且有一个初始值,则reduce()只是简单地返回那个址erbium调用化简函数

reduce()和reduceRight()都能接受一个可选参数,它指定化简函数的this值


数组类型

给定一个未知的对象,判断是否为数组用Array.isArray()函数


作为数组的字符串

字符串是不可变值,故当把它们看作数组时,是制度的。如push().sort().reverse()和splice()等数组方法会改变数组,在字符串上是无效的。不仅如此,使用数组方法来修改字符串会导致错误——出错时无提示


1 0