数组是一个有序的集合,javascript数组中的元素的类型能够是任意的,同一个数组不一样元素之间的类型也是能够不一样的。数组也是对象,有个length属性,记录数组的长度。javascript
var a = [1,2]; console.log(a.[0])//1
数组是对象,这由于着能够给它添加属性:java
var a = [];
a.test = 'test';
console.log(a.length);
a['0'] = 3;
console.log(a.length);
console.log(a.test);//test
console.log(a['0']);//3
console.log(a[0])//3数组
从上面也能够看到,给数组添加‘0’的属性,也会自动转化成索引。函数
var a = [1,2,3]; console.log(a.length);//3 a[3] = 4; console.log(a.length);//4
更改length为比如今当前长度的非负整数的时候,大于等于长度的那些元素会被删除:spa
var a = [1,2,3,4,5,6,7,8,9]; console.log(a.length);//9 a.length = 8; console.log(a[8]);//undefined a.length = 7; console.log(a[7]);//undefined
更改length为比当前长度达的非负整数的时候,至关于增长了空白区域。code
for(var i = 0; i < array.length; i++){ }
这样作有个问题就是:要访问不少遍array的length属性,因此更好的作法是下面这种:对象
for(var i = 0, len = array.length; i < len; i++){ }
或者像下面这样从后面开始遍历:blog
for(var i = array.length - 1; i >= 0; i--){ }
另外能够用for/in来遍历:排序
for(var i in array){ }
可是这样子带来的问题就是,除了索引属性以外,还会有继承来的属性、负整数属性、字符串属性也会被包含在其中。继承
ecma5定义了一个forEach函数:
var a = [1,2,3,4,5]; a.forEach(function(index){ console.log(index) })
var a = [1,2,3,4,5]; console.log(a.toLocaleString());//1,2,3,4,5 console.log(a.toString());//1,2,3,4,5 console.log(a.valueOf());//[1,2,3,4,5]
并且会将数组扁平化:
var a = [1,2,3,4,5,[ 6,7,[ 8,9] ] ]; console.log(a.toLocaleString());// 1,2,3,4,5,6,7,8,9 console.log(a.toString());// 1,2,3,4,5,6,7,8,9
join方法是利用给定的字符将数组元素连成一个字符串。实际上对每一个元素调用了toString方法。
var a = [1,2,3,4,5,[6,7,[8,9]]]
console.log( a.join('*') );//1*2*3*4*5*6,7,8,9
console.log(a);//var a = [1,2,3,4,5,[6,7,[8,9]]]
var a = [1,2,3,4,5]; console.log(a.length);//5 a.push(6); console.log(a.length);//6 console.log( a[a.length - 1] );//6
pop恰好相反,它会返回删除的元素。
var a = [1,2,3,4,5]; console.log(a.length);//5 a.shift(); console.log(a.length);//4 console.log( a[0] );//2
unshift恰好相反。
var a = [1,2,3,4,5]; console.log( a.reverse() );//[5, 4, 3, 2, 1] console.log(a);//[5, 4, 3, 2, 1]
能够看到,reverse是直接改变数组自己的。
另外一个sort方法接受一个函数做为排序的依据。若是不传这个参数,则是对每一个元素调用toString方法而后比较。也就是所有转换为字符串而后再比较。
var a = [2,43,25,64,62,45,75,10,4,7] console.log(a.sort());//[10, 2, 25, 4, 43, 45, 62, 64, 7, 75] console.log(a);//[10, 2, 25, 4, 43, 45, 62, 64, 7, 75]
若是传入函数,则函数有两个参数,就是两个要进行比较的数据。如function(a1,a2){};要想a1排在前面就返回小于0;要想顺序不变返回0;另外一种状况你懂得。如想要按照数字的小到大排序。
var a = [2,43,25,64,62,45,75,10,4,7] console.log(a.sort(function(a, b){ return a - b; }));//[2, 4, 7, 10, 25, 43, 45, 62, 64, 75] console.log(a);//[2, 4, 7, 10, 25, 43, 45, 62, 64, 75]
var a = [1,2,3,4]; var b = [5,6,7,[7,8],9]; console.log(a.concat(b))//[1, 2, 3, 4, 5, 6, 7, [7,8], 9] console.log(a)//[1,2,3,4]; console.log(b)//[5,6,7,[7,8],9]
能够看到concat并不会将数组扁平化、并且不会改变原数组。它是想建立一个a的副本,而后将b复制进去而后返回。
slice是基于当前数组,建立一个新的数组。接受两个参数,第二个参数是可选的。若是只有一个参数,就是从指定位置到最后一个的项。若是有两个参数,则是从第一个到第二个指定位置的项,但不包括最后一个。第二个参数能够是负数,-1表明最后一个项,但不包括最后一个。
var a = [1,2,3,4,5]; console.log( a.slice(1) );//[2,3,4,5] console.log( a.slice(0, 3) );//[1,2,3] console.log( a.slice(0, -3) );;//[1,2]
一样的,slice不会改变原数组。而且当第二个参数的位置在第一个参数位置以前的时候,会返回一个空数组。
splice功能很是强大,能够删除、插入、替换
若是只传入两个参数,就是删除,第一个参数表明要删除的其实位置,第二个参数表明要删除的项的个数。
var a = [1,2,3,4,5]; console.log(a.splice(1,2));//[2,3] console.log(a);//[1,4,5]
若是传入两个以上参数,而且第二个参数是0,就是插入。第一个参数表明要插入的位置,第三个以及之后的参数表明要插入的项。
var a = [1,2,3,4,5]; console.log(a.splice(1,0,7,8));//[] console.log(a);//[1,7,8,2,3,4,5]
若是传入两个以上参数,而且第二个参数不是0,就是替换。第一个参数表明要替换的开始位置,第二个参数表明要替换掉多少个项,第三个以及之后的参数表明要替换进去的项。
var a = [1,2,3,4,5]; console.log(a.splice(1,2,7,8));//[2,3] console.log(a);//[1,7,8,4,5]
最后看一个例子:
var a = [1,2,3,4,5]; console.log(a.splice(-1,2,7,8));//[5] console.log(a);//[1, 2, 3, 4, 7, 8]
这个例子说明,第一个参数接受负数,-1表明最后一个项。
var a = [1,2,3,4,5,4,3,2,1] console.log(a.indexOf(4));//3 console.log(a.lastIndexOf(4));//5
var a = []; for(var i = 1; i <= 100; i++){ a[i-1] = i; } var resule = a.reduce(function(last, value, i, arr){ return last + value }) console.log(resule)//5050