数组详解
JavaScript的Array
可以包含任意数据类型,并通过索引来访问每个元素。
要取得Array
的长度,直接访问length
属性:
var arr = [1, 2, 3.14, 'Hello', null, true];
arr.length; // 6
请注意,直接给Array
的length
赋一个新的值会导致Array
大小的变化:
var arr = [1, 2, 3];
arr.length; // 3
arr.length = 6;
arr; // arr变为[1, 2, 3, undefined, undefined, undefined]
arr.length = 2;
arr; // arr变为[1, 2]
Array
可以通过索引把对应的元素修改为新的值,因此,对Array
的索引进行赋值会直接修改这个Array
:
var arr = ['A', 'B', 'C'];
arr[1] = 99;
arr; // arr现在变为['A', 99, 'C']
请注意,如果通过索引赋值时,索引超过了范围,同样会引起Array
大小的变化:
var arr = [1, 2, 3];
arr[5] = 'x';
arr; // arr变为[1, 2, 3, undefined, undefined, 'x']
大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的Array
却不会有任何错误。
在编写代码时,不建议直接修改Array
的大小,访问索引时要确保索引不会越界。
初始化数组
var a = new Array();
var a = new Array(10);//10代表数组的长度
var a = new Array('10');//初始化化数组,数组长度为1
数组读和写的方式
读__a[a.length-1]//访问数组最后一项
写
a[100] = 0//这时数组的长度为100,没有初始化的默认值为undefined
数组方法
1.栈方法(后进先出)
push()=>接收/任意数量的参数/,把它们逐渐添加到数组/末尾/,并返回修改后/数组的长度/(后进)
pop()=>数组末尾移除/最后一项/,减少数组的length值,然后返回/移除的项/(先出)
push()方法----返回值为:数组的新长度
pop()方法----返回值为:删除的那个元素,空数组不报错,返回undefined
var arr = [1, 2];
arr.push('A', 'B'); // 返回Array新的长度: 4
arr; // [1, 2, 'A', 'B']
arr.pop(); // pop()返回'B'
arr; // [1, 2, 'A']
arr.pop(); arr.pop(); arr.pop(); // 连续pop 3次
arr; // []
arr.pop(); // 空数组继续pop不会报错,而是返回undefined
arr; // []
2.队列方法(先进先出)
unshift()=>接收任意数量的参数,把它们逐渐添加到数组/前端/,并返回修改后/数组的长度/(先进)
shift()=>移除数组中的/第一个项/,减少数组的length值,并返回/移除的项/(先出)
unshift()方法返回值----数组的新长度
shift()方法返回值----删除的元素,空数组不报错,返回undefined
var arr = [1, 2];
arr.unshift('A', 'B'); // 返回Array新的长度: 4
arr; // ['A', 'B', 1, 2]
arr.shift(); // 'A'
arr; // ['B', 1, 2]
arr.shift(); arr.shift(); arr.shift(); // 连续shift 3次
arr; // []
arr.shift(); // 空数组继续shift不会报错,而是返回undefined
arr; // []
3.indexOf
与String类似,Array
也可以通过indexOf()
来搜索一个指定的元素的位置:
返回值为指定元素的索引值,当未找到返回值为-1
arr.indexOf(20); // 元素20的索引为1
arr.indexOf(30); // 元素30没有找到,返回-1
4.splice
splice()
方法是修改Array
的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:
第一个参数指定起始位置
第二个参数指定要删除的项数
第三个以及后面的参数要插入的项
返回值----删除的元素,未删除元素时返回[]
var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 从索引2开始删除3个元素,然后再添加两个元素:
删除时注意:直接从给定的索引值当前删除,千万不要惯性思维,从给定值的下一个算,那是错误的
arr.splice(2, 3, 'Google', 'Facebook'); // 返回删除的元素 ['Yahoo', 'AOL', 'Excite']
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
// 只删除,不添加:
arr.splice(2, 2); // ['Google', 'Facebook']
arr; // ['Microsoft', 'Apple', 'Oracle']
// 只添加,不删除:
arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
5.slice
slice()
就是对应String的substring()
版本,它截取Array
的部分元素
返回值为一个新的Array
:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: ['A', 'B', 'C']
arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G']
注意到slice()
的起止参数包括开始索引,不包括结束索引。
如果不给slice()
传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array
:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var aCopy = arr.slice();
aCopy; // ['A', 'B', 'C', 'D', 'E', 'F', 'G']
aCopy === arr; // false
因为aCopy是克隆出来的新对象,哪怕数组中的元素一模一样,但aCopy跟arr都是两个对象,两个对象又不是指向同一块内存空间,所以不相等
6.sort
默认情况下sort()方法按升序排列数组项,sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,即使数组中的每一项都是数值,sort()方法比较的也是字符串。
因此sort()方法可以接收一个比较函数作为参数,以便我们指定那个位置位于那个位置前面。比较函数接收两个参数,如果第一个参数位于第二个之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数位于第二个参数之后则返回一个正数。由于比较函数通过返回一个小于0、等于0或大于0的值来影响排序结果,因此减法操作就可以适当的处理所有情况。
返回值----变化后的数组
重排序方法(默认升序<0)==>a.sort(function(value1,value2){return value1-value2})
var a = ['ab','bc','abc'];
a.sort()//['ab','abc','bc'];
--------------------------------------------
var a = [2,20,3];
a.sort()//[2, 20, 3](20转换为字符串)
--------------------------------------------
var a = ['ant','Bug','cat','Dog'];
a.sort()//["Bug", "Dog", "ant", "cat"](大写字母排前面)
a.sort(function(a,b){a.toLowerCase()<b.toLowerCase()})//["ant", "Bug", "cat", "Dog"]
7.reverse
reverse()
把整个Array
的元素给掉个个,也就是反转:
返回值----变化后的数组
8.concat
concat()
方法把当前的Array
和另一个Array
连接起来
返回值----一个新的Array
请注意,concat()
方法并没有修改当前Array
,而是返回了一个新的Array
。
实际上,concat()
方法可以接收任意个元素和Array
,并且自动把Array
拆开,然后全部添加到新的Array
里:
var arr = ['A', 'B', 'C'];
arr.concat(1, 2, [3, 4]); // ['A', 'B', 'C', 1, 2, 3, 4]
9.join
join()
方法是一个非常实用的方法,它把当前Array
的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:
var arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'
如果Array
的元素不是字符串,将自动转换为字符串后再连接。
多维数组
如果数组的某个元素又是一个Array
,则可以形成多维数组,例如:
var arr = [[1, 2, 3], [400, 500, 600], '-'];
上述Array
包含3个元素,其中头两个元素本身也是Array
。
通过索引取到500
这个值:arr[1][1];