数组
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 的大小,访问索引时要确保索引不会越界。
indexOf
与String类似, Array 也可以通过 indexOf() 来搜索一个指定的元素的位置:
var arr = [ 10 , 20 , '30' , 'xyz' ];
arr.indexOf( 10 ); // 元素10的索引为0
arr.indexOf( 20 ); // 元素20的索引为1
arr.indexOf( 30 ); // 元素30没有找到,返回-1
arr.indexOf( '30' ); // 元素'30'的索引为2
注意了,数字 30 和字符串 '30' 是不同的元素。
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
push和pop
push() 向 Array 的末尾添加若干元素, pop() 则把 Array 的最后一个元素删除掉:
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; // []
unshift和shift
如果要往 Array 的头部添加若干元素,使用 unshift() 方法, shift() 方法则把 Array 的第一个元素删掉:
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; // []
sort
sort() 可以对当前 Array 进行排序,它会直接修改当前 Array 的元素位置,直接调用时,按照默认顺序排序:
var arr = [ 'B' , 'C' , 'A' ];
arr.sort();
arr; // ['A', 'B', 'C']
能否按照我们自己指定的顺序排序呢?完全可以,我们将在后面的函数中讲到。
reverse
reverse() 把整个 Array 的元素给掉个个,也就是反转:
var arr = [ 'one' , 'two' , 'three' ];
arr.reverse();
arr; // ['three', 'two', 'one']
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']
concat
concat() 方法把当前的 Array 和另一个 Array 连接起来,并返回一个新的 Array :
var arr = [ 'A' , 'B' , 'C' ];
var added = arr.concat([ 1 , 2 , 3 ]);
added; // ['A', 'B', 'C', 1, 2, 3]
arr; // ['A', 'B', 'C']
请注意 , 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]
join
join() 方法是一个非常实用的方法,它把当前 Array 的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:
var arr = [ 'A' , 'B' , 'C' , 1 , 2 , 3 ];
arr.join( '-' ); // 'A-B-C-1-2-3'
如果 Array 的元素不是字符串,将自动转换为字符串后再连接。
对于数组,除了 map() 、 reduce 、 filter() 、 sort() 这些方法可以传入一个函数外, Array 对象还提供了很多非常实用的高阶函数。
every
every() 方法可以判断数组的所有元素是否满足测试条件。
例如,给定一个包含若干字符串的数组,判断所有字符串是否满足指定的测试条件:
'use strict';
Run
find
find() 方法用于查找符合条件的第一个元素,如果找到了,返回这个元素,否则,返回 undefined :
'use strict';
Run
findIndex
findIndex() 和 find() 类似,也是查找符合条件的第一个元素,不同之处在于 findIndex() 会返回这个元素的索引,如果没有找到,返回 -1 :
'use strict';
Run
forEach
forEach() 和 map() 类似,它也把每个元素依次作用于传入的函数,但不会返回新的数组。 forEach() 常用于遍历数组,因此,传入的函数不需要返回值:
'use strict';
Run
网友评论