深入浅出 JavaScript 数组 v0.5
有一段时间不更新博客了,今天分享给大家的是一篇关于JS数组的,数组其实比较简单,但是用法非常灵活,在工作学习中应该多学,多用,这样才能领会数组的真谛。
以下知识主要参考《JS 精粹》和《JavaScript 高级程序设计》。
数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素。JavaScript 没有像此类数组一样的数据结构。
它提供了一些类数组特性的对象,它把数组的下标转变为字符串,用其作为属性。
ECMAScript和其他语言中的数组的区别:
- ECMAScript 数组中的每一项可以保存任何类型的数据。
- ECMAScript 数组的大小是可以动态调整的。
创建数组的方式:
var arr = new Array(); var arr1 =[]; // 创建两个空数组
一个有趣的属性 length
每个数组都有一个 length 属性。JavaScript 数组的 length 是没有上界的。
length 属性的值是这个数组最大整数属性名加上1.它不一定等于数组里的属性的个数。
var arr = []; arr.length; // 0 arr[100] = true; arr.length; // 101 // arr只包含一个属性
length值不是只读的,可以设定length的值。
设置更大的length不会给数组分配更多的空间。
而把length 设小将导致所有下标大于等于新length 的属性被删除。
删除一个元素
JavaScript 数组就是对象,可以使用 delete 运算符删除数组中的元素。
delete numbers[2]; // numbers 是 ['zero','one',undefined,'three']
被删除的元素变成undefined。并不会将后面的元素依次前移。
数组的检测
对于一个网页或一个全局作用域而言,使用 instanceof 操作符就能得到满意的结果。
if (value instanceof Array) { // do sth with array }
如果实际中有两个全局环境的话,就存在两个不同版本的Array 构造函数,如果你从一个框架向另一个框架传入一个数组,
那么传入的数组与第二个框架中原生创建的数组分别具有各自不同的构造函数。
为了解决这个问题,ECMAScript 5 新增了Array.isArray() 方法。
if (Array.isArray(value)) { // do sth with array }
转换方法(以下方法不做举例,请参考API)
所有对象都具有 toString()、valueOf()方法。
toString() 方法返回的是由数组每个值的字符串形式拼接而成的一个以逗号分隔的字符串。
valueOf() 返回的还是数组。
Array.join() 方法返回以参数为分隔的字符串。
栈方法
数组可以表现的像栈一样,栈是一种LIFO的数据结构,JS数组提供的方法是 push() 和pop()
push() 方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返回修改后数组的长度。
pop() 方法则从数组的末尾移除最后一项,减少数组的 length 值,然后返回移除的项。
队列方法
队列数据结构的访问规则是FIFO,队列在列表的末端添加项,从列表的前端移除项。
push() 方法想数组末端添加项。
shift() 从数组前端取得项,同时length 减1.
unshift() 从数组的前端添加任意项,并返回新数组的长度,因此可以使用unshift() 方法和pop() 方法从相反的方向实现队列。
重排序方法
reverse() 反转数组项的顺序。 这个方法的作用直观明了,但不够灵活。
sort() 方法默认按升序排列数组项,它会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。
即使数组中的每一项都是数组,sort() 方法比较的也是字符串。
该方法可以接受一个比较函数作为参数,sort 可以按照比较函数给定的规则对数组进行排序。
这两个方法的返回值都是经过排序后的数组。
操作方法
concat() 方法可以基于当前对象的所有项创建一个新的数组,接收的参数添加到新数组的末尾。
参数如果是数据项,则直接添加到末尾,如果是数组,则将数组的每一项添加到末尾。
slice() 该方法基于当前数组中的一个或多个项创建一个新数组。该方法可以接收一个或两个参数,即要返回项的起始和结束位置。
在只有一个参数的情况下,slice() 方法返回参数指定位置到当前数组末尾的所有项。
如果有两个参数,则返回起始和结束位置之间的项,但不包括结束位置的项。
如果参数中有一个负数,则用数组长度加上该数来确定响应的位置。
splice() 这个方法是最强大的数组方法。它的最主要用途是向数组的中部插入项。
- 删除: 可以删除任意数量的项,只需指定2个参数;要删除的第一项的位置和要删除的项数。
- 插入: 可以向指定位置插入任意数量的项,只需提供三个参数:起始位置、0(要删除的项数)和要插入的项。如果要插入多个项,可以传入第四,第五。。个参数。
- 替换: 可以向指定位置插入任意数量的项,三个参数,起始位置、要删除的项数和要插入的任意数量的项。插入的项不必和删除的项数相等。
位置方法
indexOf() 和 lastIndexOf() 两个方法都接收两个参数:要查找的项和(可选)表示查找起点位置的索引。
两个方法都返回要查找的项的位置,没有为-1.在查找的过程中,使用的是全等操作符(===)。
其中indexOf() 方法从数组的开头向后查找,lastIndexOf() 方法则从数组的末尾向前查找。
迭代方法
every() 对数组中每一项运行给定函数,如果该函数对每一项都返回true,则返回true
filter() 对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组
foreach() 对数组中的每一项运行给定的函数,这个函数没有返回值
map() 对数组中的每一项运行给定的函数,返回每次调用函数返回的结果组成的数组
some() 对数组汇总的每一项运行给定的函数,如果函数对任一项返回true,则返回true
归并方法
reduce() 和reduceRight() 都会迭代数组的所有项,然后构建一个最终返回的值,
其中reduce() 方法从数组的第一项开始逐个遍历到最后。
而 reduceRight() 则从数组的最后一项开始,向前遍历到第一项。
这两个方法接收两个参数,一个在每一项上调用的函数和(可选的)最为归并基础的初始值。
传给reduce* () 的函数接收四个参数:前一个值,当前值,项的索引,和数组对象。
这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,
因此第一个参数是数组的第一项,第二个参数就是数组的第二项。