首页 > 代码库 > javascript数组
javascript数组
javascript的实现对数组做了很多优化,使得典型的数组操作可以很快(用类型化数组在执行时间和内存使用上会更加高效)
三种构造方式:
new Array()
new Array(size)
new Array(element,element.....)
eg:
var array = new Array()var array = new Array(10)var array = new Array(1,2,3);var array = [1, 2, 3];
注意 1、 size设置数组元素的个数,返回数组元素的length等于size
2、 改变数组的length属性会裁剪或者扩充数组
eg:
var array1 = new Array(10);array1.push(1);console.log("array1.length = " + array1.length); //11console.log("array1[9] = " + array1[9]); //undefinedvar array2 = new Array();array2.push(1);console.log("array2.length = " + array2.length); //1var array3 = new Array(10);array3[0] = 1;console.log("array3.length = " + array3.length); //10var array4 = [1, 2, 3];array4.push(3,4);console.log("array4.length = " + array4.length); //5var array5 = [1, 2, 3];array5.length = 2;console.log("array5[2] = " + array5[2]); //undefined;var array6 = [1, 2, 3];array6.length = 10;console.log("array6[9] = " + array6[9]); //undefined;console.log("array6.length = " + array6.length); //10
ECMAScript3 方法:
concat:衔接数组,返回新的数组
var a = [1, 2, 3];a.concat(2, 2); //[1, 2, 3, 2, 2]a.concat([2, 2]); //[1, 2, 3, 2, 2]a.concat([1,1], [2, 2]); //[1, 2, 3, 1, 1, 2, 2]a.concat([1,[2,2]]); //[1, 2, 3, 1, [2, 2]]
join()
[1,2,3].join("@@"); //1@@2@@3
pop()和push(): 1、pop移除数组最后一个元素,缩短数组长度;push()添加元素,元素追加在数组末尾
2、pop返回数组最后一个元素,push返回追加后数组的新长度
3、直接修改数组,不会创建新的数组
//pop和pushvar stack = [];stack.push(1, 2); //stack=[1, 2]; 返回2stack.pop(); //stack为[1], 返回2stack.push([3, 3]); //stack为[1, [3, 3]],返回2stack.pop(); //stack为[1],返回 [3, 3]
reverse():反转数组元素,重新调整数组元素顺序,不会创建新的数组,返回调整后的数组
var a = [1, 2, 3];a.reverse(); //[3,2,1]
shift和unshift:
1、shift():移除并返回数组的第一个元素,并将后续元素向前移一位,如果数组为空,直接返回undefined,shift不会创建新的数组,而是直接修改数组
2、unshift(): 数组头部插入元素, 返回数组的长度
//shiftvar a = [1, 2, 3];a.shift(); //返回1,数组变为[2,3]var a = new Array();a.shift(); //返回undefined
//unshiftvar a = [1, 2, 3];a.unshift(4); //返回4, 数组为[4, 1, 2, 3]
slice和splice
1、slice:返回数组一部分,返回新数组,注意下标的使用
2、splice:1、插入、删除或者替换数组元素, 注意区别于slice()
2、array.splice(start, deleteCount, value,...)
3、start:开始删除或者插入元素的序号
4、deleteCount,要删除的元素的个数,如果是0表示添加元素
5、value:要插入数组的元素,一个或者是多个
6、如果有删除数据,返回由删除数据构成的数组,如果没有删除数据,则返回[]
eg:
var a = [1, 2, 3, 4, 5, 6];a.slice(0, 3); //[1, 2, 3]a.slice(3); //[4, 5, 6]a.slice(1, -1); //[2, 3, 4, 5] ,第二个参数为负数时即从数组尾部开始计算
//splicevar a = [1, 2, 3, 4, 5, 6];a.splice(3); //a 变为[1, 2, 3] 返回[4, 5, 6]a.splice(3, 2); //a 变为[1, 2, 3, 6] 返回[4, 5]a.splice(1, 0, 3, 5); //a变为[1, 3, 5, 2, 3, 4, 5, 6] ;返回[]
sort:数组排序,返回数组引用,没有新建数组,不带参数时默认是按字母排序
//sortvar a = [11, 2, 3, "a"];a.sort(); //[11, 2, 3, "a"]var a = [11, 2, 3, "a"];function orderByNumber(a, b){ return a - b;}a.sort(orderByNumber); //[2, 3, 11, "a"]
toString 和 toLocalString
1、toString有必要时会调用元素的toString;等价于使用join()
2、toLocalString对数组每个元素调用toLocalString
//toString[1, 2, 3].toString(); //"1,2,3"[1, 2, 3].join(); //"1,2,3"[1, 2, "a", [2, "b"]].toString(); //"1,2,a,2,b"
ECMAScript5 新增方法:
every(): 测试断言函数是否对于数组中每个元素为真,每个为真返回true,否则返回false
eg:
[1, 2, 3].every(function(x){ return x < 5;}); //true[1, 2, 3].every(function(x){ return x <3;}); //false
filter(): 过滤不满足条件的数组元素,返回符合条件的数组
eg:
[1, 2, 3].filter(function(x){ return x < 3;}); //[1,2]
forEach(): 为每个数组元素调用一个函数,没有返回值
注意:1、forEach没有返回值
2、对于forEach中每次调用的函数对于数组序号i有三个参数: f(array[i], i, array)
3、forEach如果设定了第二个参数object,则在函数内的this指向object, 类似于map、 filter、every等
eg:
//forEach[1, 2, 3].forEach(function(x){ x++; //return undefined;});var a = [1, 2, 3];a.forEach(function(x,i, a){ a[i]++; //return undefined;});console.log("a = " + a); //2, 3, 4 var b = [1, 2, 3];b.forEach(function(x){ console.log(x); x++; //return undefined;});console.log("b = " + b); //1, 2, 3
indexOf():查找数组,返回查找元素的下标
[1, 2 ,3].indexOf(1); //0;[1, 2 ,3].indexOf(1, 1); //-1; 第二个参数是开始查找的下标[1, 2 ,3].indexOf(4); //-1;
lastIndexOf():反向查找数组,返回查找元素的下标
//lastIndexOf[1, 2, 3].lastIndexOf(4); //-1[1, 2, 3].lastIndexOf(3); //2[1, 2, 3].lastIndexOf(3, 1); //-1 ,第二个参数设置开始查找的位置,1表示从倒数第二个数开始
map(): 从数组元素中计算新值,返回新的数组
[1, 2, 3].map(function(x){ return x * x; //[1, 4, 9]});
reduce():1、从数组元素中计算新的值,返回最后一次调用f的返回值
2、添加第二个参数时相当于传递给函数的初始值,结果等价于将第二个参数添加在数组的头部
//reduce[1, 2, 3].reduce(function(x, y){ return x * y; //(1*2)*3 = 6;})[1, 2, 3].reduce(function(x, y){ return x + y; //(1+2)+3 = 6})[1, 2, 3].reduce(function(x, y){ return x * y; //((6*1)*2)*3 = 36;}, 6);[1, 2, 3].reduce(function(x, y){ return x + y; //((6+1)+2)+3 = 12}, 6)
reduceRight():原理类似于reduce,只是从右向左开始
//reduceRight[1, 2, 3].reduceRight(function(x, y){ return x * y; //(3*2)*1 = 6;})[1, 2, 3].reduceRight(function(x, y){ return x + y; //(3+2)+1 = 6})[1, 2, 3].reduceRight(function(x, y){ return x * y; //((6*3)*2)*1 = 36;}, 6);[1, 2, 3].reduceRight(function(x, y){ return x + y; //((6+3)+2)+1 = 12}, 6)
some():判断是否有元素满足断言函数,至少有一个满足时返回true,否则返回false
//some[1, 2, 3].some(function(x){ return x > 2; //true});[1, 2, 3].some(function(x){ return x > 3; //false});