数组的属性与方法(Javascript权威指南第六版)
构造函数
new Array();
new Array(size);
new Array(ele1,ele2,…,elen);
返回值
新建和初始化数组。当不带参数调用Array()时,返回的数组为空,length属性为0。当用单个数值参数调用时,构造函数返回的数组带有指定个数的未定义元素。使用其他参数调用时,构造函数会使用指定的参数值初始化数组。当Array()构造函数不带new操作符,直接当做函数调用时,其表现行为与带new操作符调用时是完全一样的。
异常
RangeError:当size为负数时或者大于2e32-1时,会抛出RangeError异常。
直接量语法
var a = [1, true, ‘abc’];
var b = [a[0], a[0]*2, f(x)];
属性
length
方法
在ES5之前,除了IE,其他浏览器已经实现了以下方法:
concat()
every()
filter()
forEach()
indexOf()
join()
lastIndexOf()
map()
pop()
push()
reduce()
reduceRight()
reverse()
shift()
slice()
some()
sort()
splice()
toLocalString()
toString()
unshift()
ES5新添加了以下方法:
every()
filter()
forEach()
indexOf()
lastIndexOf()
map()
reduce()
reduceRight()
some()
Array.concat()
衔接数组
array.concat(value, …)
返回值
返回一个新数组,包含array的元素以及衔接的新元素
细节
concat()会将参数衔接到array中得到一个新数组并返回;
它不会修改原数组array;
如果传给concat()的某个参数本身是一个数组,则会将数组的元素衔接到array中,而不是数组本身。多维数组只传递本维度的数组元素。
示例
var a = [1,2,3];
a.concat(4,5); //[1,2,3,4,5]
a.concat([4,5]); //[1,2,3,4,5]
a.concat([4,5],[6,7]) //[1,2,3,4,5,6,7]
a.concat(4,[5,[6,7]]) //[1,2,3,4,5,[6,7]]
Array.every()
测试断言函数是否对每个函数为真
array.every(predicate);
array.every(predicate, o);
predicate:用来测试数组元素的断言函数。 o:调用predicate时的可选this值。
返回值
如果predicate函数都返回true,则返回true;如果有任何一个元素的predicate返回false,则返回false。
细节
every()方法用来测试数组的所有元素是否满足某些条件。它会遍历array的元素,对每个元素调用predicate函数,遇到false则终止遍历,返回false。当遍历的数组为空,返回true。
对数组的每一个序号i,调用predicate时带有三个参数:
predicate(array[i], i, array);
示例
[1,2,3].every(function(x){ return x < 5; }) //=>true:所有元素都小于5
[1,2,3].every(function(x){ return x < 3; }) //=>false:最后一个元素不小于3
[].every(function(x){ return false; }) //=>true:空数组总返回true
Array.filter()
返回通过断言的数组元素
array.filter(predicate);
array.filter(predicate, o);
返回值 新数组,返回一个只包含那些让predicate返回true的数组元素组成的新数组。
细节
filter()会创建一个新数组,包含那些predicate返回true的数组元素;
不会修改array数组本身(但是predicate可能会修改);
按序号从小到大遍历数组,predicate函数有三个参数
predicate(array[i], i, array)
示例
[1,2,3].filter(function(x){ return x > 1; }) //=>[2,3]
Array.forEach()
为每一个数组元素调用一个函数
array.forEach(f);
array.forEach(f, o);
返回值 无返回值
细节
按序号从小到大遍历数组,对每一个数组元素调用一次f;
f(array[i], i, array);
f的任何返回值都会被忽略,注意forEach()没有返回值。特别注意,它不会返回数组。
数组方法的细节
下述细节适用于forEach()方法,也适用于相关方法:map(), filter(), every()和some()。
所有这些方法都接受函数作为第一个参数,并接受可选的第二个参数。如果指定了第二个参数o,则调用函数时,就好像该函数是o的方法一样。也就是说,在函数体内,this值等于o。如果没有指定第二个参数,则就像函数一样调用该参数(而不像方法),this值在非严格模式下是全局对象,在严格模式下则是null。
所有这些方法都会在开始遍历前就记录array的length长度。如果调用函数把新元素追加到array中,这些新元素是不会遍历到的。如果调用的函数修改了为遍历到的已存在元素,则调用时会传递修改后的值。
当作用于稀疏数组时,这些方法不会在实际不存在元素的序号上调用函数。
示例
var a = [1, 2, 3];
a.forEach(function(x,i,a){ a[i]++; }); //a现在是[2,3,4]
Array.indexOf()
查找数组
array.indexOf(value);
array.indexOf(value, start);
value:要在array中查找的值; start:开始查找的可选数组序号。如果省略,默认为0。
返回值 一个大于等于start的最小序号值,该序号值处的array元素与value全等。如果不存在匹配的元素,则返回-1。
细节
查找value值在array中的序号,并返回第一个匹配的序号;
查找的起始位置从start指定的数组序号开始(包括start),如果没有start,则从0开始,直到找到匹配的元素或者检查完所有元素。
判断是否相等使用”===”操作符。
返回找到的第一个匹配元素的序号,若没找到,返回-1。
示例
[‘a’, ‘b’, ‘c’].indexOf(‘b’) //=> 1
[‘a’, ‘b’, ‘c’].indexOf(‘d’) //=> -1
[‘a’, ‘b’, ‘c’].indexOf(‘a’, 1) //=> -1
Array.join()
将数组元素衔接为字符串
array.join();
array.join(separator);
separator:分隔符,如果省略,默认是英文逗号(,)。
返回值
一个字符串。
细节
逆向方法String.split()。
示例
a = new Array(1,2,3,”testing”);
s = a.join(“+”); // s是字符串”1+2+3+testing”
Array.lastIndexOf()
反向查找数组,参照Array.indexOf()。
array.lastIndexOf(value);
array.lastIndexOf(value, start);
Array.map()
从数组元素中计算新值
array.map(f);
array.map(f, o);
返回值
一个新数组,由函数f计算出的元素组成。
细节
map()会创建一个新数组,长度与array一样,数组元素通过将array的元素传递给f计算得到。
原数组不变。
map()按照从小到大的顺序遍历array的序号,并为每一个元素调用一次f,对于序号i,调用f时带有三个参数:
a[i] = f(array[i], i, array);
示例
var arr = [1,2,3];
arr.map(function(x){return x*x; }); //=>[1,4,9]
Array.pop()
移除并返回数组的最后一个元素
array.pop();
返回值
array的最后一个元素
细节
会改变原数组,移除array的最后一个元素,缩短数组长度;
返回所移除的元素的值;
如果数组为空,返回undefined,不会修改原数组array。
示例
pop()与push()可以提供先进后出(FILO)的栈功能
var stack = []; // stack: []
stack.push(1,2); // stack: [1,2] 返回2
stack.pop(); // stack: [1] 返回2
stack.push([4,5]); // stack: [1,[4,5]] 返回[4,5]
stack.pop(); // stack: [1] 返回[4,5]
stack.pop(); // stack: [] 返回1
Array.push()
给数组追加元素
array.push(value, …)
返回值
数组的新长度
细节
直接修改array,array的长度会改变。
可以和pop()一起提供先进后出的栈功能。
示例
参照Array.pop()。
Array.reduce()
从数组元素中计算出一个值
array.reduce(f);
array.reduce(f, inital);
f:一个函数,可以合并两个值(比如两个数组元素),并返回一个”缩减”的新值。 inital:用来缩减数组的可选初始值。如果指定该参数,reduce()的行为会像是把该参数插入到array的头部一样。
返回值
数组的化简值,该值是最后一次调用f时的返回值。
细节
reduce()方法就收函数f作为第一个参数。该函数的行为应该像一个二元操作符一样:接受两个值,执行某些操作,返回结果。如果array有n个元素,reduce()的方法会调用n-1次来将这些元素缩减为一个合并值。
第一次调用f时传入的是array的前两个元素。接下来的调用会传入之前的计算值和array的下一个元素(按从小到大的序号顺序)。最后一次调用f的返回值会成为reduce()方法的返回值。
可以传入可选的参数inital。如果指定inital,reduce()的行为会像是把该参数插入到数组头部一样(注意,实际上并没有修改数组)。当指定inital时,要缩减的元素有n+1个,调用n次f。
如果array为空,又没有指定inital,会抛出typeError异常。
如果array为空,但指定inital,则返回inital,且永远不调用f。
如果array只有一个元素,且没有指定inital,则不调用f,返回array的单个元素。
实际上f有四个参数,第三个参数是第二个参数的序号,第四个是array本身:
f(a1,a[i],i,array);
示例
[1,2,3,4].reduce(function(x,y){
return x*y;
}); //=> 24: ((1*2)*3)*4
Array.reduceRight()
从右到左缩减数组
array.reduceRigt(f);
array.reduceRight(f, initial);
返回值
数组的缩减值,参照reduce()。
细节
与reduce()一样,唯一区别就是从右到左(序号从大到小)
示例
[2,10,60].reduceRight(function(x,y){
return x/y;
}); //=>3:(60/10)/2
Array.reverse()
颠倒数组中的元素顺序
array.reverse();
细节
在原数组中进行操作,重新调整array的元素,而不是创建一个新的数组
示例
a = new Array(1,2,3);
a.reverse(); // a现在是[3,2,1]
Array.shift()
移除数组的第一个元素
array.shift();
返回值 数组原来的第一个元素
细节
移除并返回array第一个元素,并将所有后续元素前移一位,填补数组头部空缺。
如果数组为空,shift()什么也不干,直接返回undefined。
没有创建新的数组,直接修改原数组array。
与unshift()一起使用。
示例
var a = [1,[2,3],4];
a.shift(); //返回1,a = [[2,3],4]
a.shift(); //返回[2,3], a = [4]
Array.slice()
返回数组的一部分
array.slice(start,end);
start:数组片段开始处的序号。如果为负数,则表示从数组尾部开始计算。 end:数组片段结束处的序号。如果没有指定,该片段会包含从start到数组结束的所有数组元素。如果为负数,则表示从数组尾部开始计算。
返回值
一个新数组。包含从start到end之间的所有元素(包含start指定的元素,不包含end指定的元素)。
细节
返回array的片段,或者称为子数组。
从start到end之间的所有元素(包含start指定的元素,不包含end指定的元素)。
如果没有指定end,该片段会包含从start到数组结束的所有数组元素。
slice()不修改原数组array,而是生成新的数组。如果要移除原数组的一部分,参照splice()。
示例
var a = [1,2,3,4,5];
a.slice(0,3); //返回 [1,2,3]
a.slice(3); //返回 [4,5]
a.slice(1,-1); //返回 [2,3,4]
a.slice(-3,-2); //返回 [3]; 在IE4下有误:返回 [1,2,3],IE4下bug:start不能为负数,IE的后续版本已经修复
Array.some()
判断是否有元素满足断言函数
array.some(predicate);
array.aome(predicate, o);
返回值 如果array中有至少一个元素调用predicate时返回true,则返回true。如果所有元素调用predicate都返回false,则返回false。
细节
测试是否有元素满足某些条件。
按从小到大的序号顺序遍历array数组,并依次调用predicate函数,如果调用返回true,则停止遍历,返回true。如果每一次都返回false,则一直遍历到数组结尾,返回false。
如果数组为空,则总是返回false。
类似every()。
示例
[1,2,3].some(function(x){ return x>5; }); //返回false
[1,2,3].some(function(x){ return x>2; }); //返回true
[].some(function(x){ return true; }); //返回false,空数组总返回false
Array.sort()
对数组元素进行排序
array.sort();
array.sort(orderfunc);
返回值 该数组的引用。注意是在原数组上进行排序,没有创建新的数组。
细节
在原数组上进行排序,没有创建新的数组。
如果调用sort()时不带参数,则按照字母顺序(更精确的说,是字符编码顺序)对数组进行排序。需要将元素转化为字符串,然后进行比较。
调用sort()时带有比较函数orderfunc的话,返回一个值表示相对顺序,比较函数接受两个参数a和b,并返回如下:
一个小于0的值。表示a<b,表示a应该排在b的前边。
0。a = b,a和b相等。
一个大于0的值。a > b,表示a应该排在b的后边。
数组中的undefined元素始终排在数组末尾,因为undefined不会传给orderfunc。
示例
//用于数组排序的排序函数
function numberorder(a, b){ return a-b; };
a = new Array(33, 4, 1111, 222);
a.sort(); //字母排序:1111,222,33,4
a.sort(numberorder); //数值排序:4,33,222,1111
Array.splice()
插入,删除或替换数组元素
array.splice(start, deleteCount, value, …)
start:开始插入和(或)删除处的数组元素的序号。 deleteCount:要删除的元素个数,从start开始,并包含start处的元素。如果指定为0,表示插入元素,而不用删除任何元素。 value,…:要插入数组的0个或多个值,从start序号处开始插入。
返回值
如果从array中删除了元素,则返回一个新数组,包含这些剔除的元素。
细节
删除从start开始(包含start)的零个或多个元素,并用参数领表中的零个或多个值替换掉那些删除的元素。
位于插入或删除的元素之后的数组元素,在有必要的情况时都会移动,以保持与原数组中剩余元素的连续性。
与slice()不同,splice()会直接修改数组,而slice()创建一个原数组的一个子数组。
示例
var a = [1,2,3,4,5,6,7,8];
a.splice(1,2); //返回 [2,3]; a此时变为[1,4,5,6,7,8]
a.splice(1,1); //返回 [4]; a此时为[1,5,6,7,8]
a.splice(1,0,2,3); //返回 []; a此时为[1,2,3,5,6,7,8]
Array.toLocaleString()
将数组转化为本地化字符串
array.toLocaleString()
返回值 数组本地化字符串表示
细节
调用该方法时如果对象不是Array,则抛出TypeError异常。
它首先调用数组所有元素的toLocaleString()方法,然后使用地区特定的分隔字符将结果字符串连接起来。
参考Array.toString()、Object.toString()。
Array.toString()
将数组转化成字符串
array.toString()
返回值 array的字符串表示
细节
调用该方法时如果对象不是Array,则抛出TypeError异常。
当数组用于字符串上下文时,Javascript会调用该方法将数组自动转换成一个字符串。但是在一些场景下,还是需要显示调用该方法。
它首先调用数组所有元素的toString()方法,然后使用逗号将结果字符串连接起来,返回与不带参数join()返回值是一样的。
Array.unshift()
在数组头部插入元素
array.unshift(value, …)
返回值 新数组的长度
细节
会将参数插入array头部,后边的元素数次后移。
不创建新数组,直接修改array本身。
示例
//unshift()经常与shift()一起使用
var a = []; //a:[]
a.unshift(1); //a:[1] 返回1
a.unshift(22); //a:[22,1] 返回2
a.shift(); //a:[1] 返回22
a.unshift(33,[4,5]); //a:[33,[4,5],1] 返回3