数组声明方式
1、Array构造函数
new Array(); // 声明一个空数组 undefined
new Array(3); // 声明包含3项的数组 undefined,undefined,undefined
new Array('hello', 'world');
new
关键字可省略
Array(3)
2、数组字面量
比较常用的方法,使用这种方式不会调用Array的构造函数(和调用构函数会有什么区别呢???)
var arr = [];
var colors= ['red', 'green', 'blue'];
由于不同浏览器表现不同,尽量不要在数组中出现空位
var arr = ['red', , ]; // 强烈不建议这种语法
数组的访问方式
var colors= ['red', 'green', 'blue'];
colors[0]; // red
数组长度 length
console.log(colors.length); // 3
清空数组
arr.length = 0;
// 或者
arr = [];
检测数组
该方法并不能准确检测数组,待改善
Array.isArray(val);
支持的浏览器:IE9+、 Firefox 4+、Safari 5+、 Opera 10.5+、Chrome
if(Array.isArray(val);){
// 执行操作
}
转换方法
1、toLocaleString()
调用数组每一项的toLocaleString方法,和toString方法返回值一样
返回值:数组中每项以逗号分割的字符串
var colors= ['red', 'green', 'blue'];
console.log(colors.toLocaleString()); // red,green,blue
2、toString()
调用数组每一项的toString方法
返回值:数组中每项以逗号分割的字符串
var colors= ['red', 'green', 'blue'];
console.log(colors.toString()); // red,green,blue
3、valueOf()
返回值:返回原数组
var colors= ['red', 'green', 'blue'];
console.log(colors.valueOf()); // red,green,blue
4、join(param)
参数:param:用作分隔符的字符串,默认值为,
返回值:包含所有数组项的字符串
var arr = [1,2,3,4,5];
console.log(arr.join()); //1,2,3,4,5
console.log(arr.join('==')); // 1==2==3==4==5
如果数组中某一项是null或者undefined,那么该值在以上方法中返回结果以空字符串表示
栈、队列方法
1、push
参数:可选,可接收任意类型、任意数量的参数
将参数添加到数组末尾
返回值:数组修改后的长度
是否改变原数组:是
var arr = [1,2,3,4,5];
arr.push({name:12});
![](https://img.haomeiwen.com/i6137811/37782016103510b2.png)
2、pop
返回值:返回数组的最后一项
是否改变原数组:是
arr.pop(); // 5
console.log(arr); // [1, 2, 3, 4]
3、shift
返回值:移除数组中第一项并返回该项
是否改变原数组:是
arr.shift(); // 5
console.log(arr); // [ 2, 3, 4, 5]
与pop相反
4、 unshift
参数:可选,可接收任意类型、任意数量的参数
将参数添加到数组头部
返回值:数组修改后的长度
是否改变原数组:是
与push相反
重排序方法
5、reverse
参数:无
返回值:返回翻转数组项顺序后的新数组
是否改变原数组:是
var arr = [1,2,3,4,5];
arr.reverse(); //[5, 4, 3, 2, 1]
6、sort
参数:可选,排序函数
返回值:返回排序后的新数组
是否改变原数组:是
sort
方法默认是升序排序,即最小的在最前面,最大的在最后面
在调用此方法时会调用每项的toString方法,然后比较得到的字符串再进行确定如何排序
这样就可能出现问题:
var arr = [1,2,3,4,5,10];
arr = arr.sort()
console.log(arr); // [1, 10, 2, 3, 4, 5]
这时就需要传入一个比较函数来确定排序顺序
比较函数需要两个参数:
如果a-b>0,a将排在b之后
如果a-b=0,a,b按照原顺序排列
如果a-b<0,a将排在b之前
// 比较函数(适用于大多数数据类型)
function compare(a, b) {
// return a - b; // 只适用于数组项为数值的数组
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
}
var arr = [1, 2, 3, 4, 5, 10];
arr = arr.sort(compare);
console.log(arr); // [1, 2, 3, 4, 5, 10]
var arr = ["a", "d", "b", "e", "c"];
arr = arr.sort(compare);
console.log(arr); // ["a", "b", "c", "d", "e"]
操作方法
7、concat
参数:可选,可以是一个元素、一维数组、二维数组、对象等
返回值:将参数添加到原数组末尾后返回改变后的数组
是否改变原数组:否
如果参数为空,则返回当前数组副本,即复制原数组
如果参数不是数组,这些值只会简单添加到原数组末尾,例如:
![](https://img.haomeiwen.com/i6137811/a38290ea60bfba88.png)
var arr = [1, 2, 3];
console.log(arr.concat(4,[5,6,7],[[8,9],[10,11]])); //[1, 2, 3, 4, 5, 6, 7, Array(2), Array(2)]
console.log(arr); //[1, 2, 3]
所以,如果用concat合并多维数组元素时显然是不靠谱的(解决办法???自己重写函数)
8、slice
参数:可选,接受一或两个参数,即起始位置、结束位置
返回值:根据参数返回截取原数组项得到的新数组
是否改变原数组:否
如果参数为空,返回原数组的副本
如果一个参数,返回从起始位置到原数组末尾所有项组成的新数组
如果两个参数,返回从起始位置到结束位置(不包括结束位置)所有项组成的新数组
如果起始位置大于结束位置,返回空数组
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arr.slice()); // [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arr.slice(0)); // [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arr.slice(2)); // [3, 4, 5, 6, 7, 8, 9];
console.log(arr.slice(2, 5)); // [3, 4, 5];
如果参数为负值,则用数组长度与该值相加确定相应位置:
console.log(arr.slice(-5,-1)); // 相当于 arr.slice(4, 8) 返回 [5, 6, 7, 8]
9、splice
参数:可选,接受1~n个参数,即起始位置、结束位置、要删除的项数和要插入的任意数量的项
返回值:根据参数返回截取原数组项得到的新数组
是否改变原数组:是
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
(1)如果不传入任何参数,返回空数组
(2)删除:
如果传入两个参数,即:要删除第一项的位置和要删除的项数
console.log(arr.splice(2,3)); // [3, 4, 5]
如果第一个参数为负值,则用原数组项数加上该值确定位置
如果相加后还为负值,则从0位置开始取
如果第二个参数为负值,返回空数组
console.log(arr.splice(-4,2)); // [6, 7]
console.log(arr.splice(-14,2)); // [1, 2]
console.log(arr.splice(-4,-2)); // []
(3)插入:
参数:起始位置、0(要删除的项)、要插入的项(可以是多个)
console.log(arr.splice(-4, 0, "ss", 'dd')); // []
console.log(arr); // [0, 1, 2, 3, 4, 5, "ss", "dd", 6, 7, 8, 9]
(4)替换
参数:起始位置、要删除的项、要插入的项(可以是多个)
console.log(arr.splice(4,2,'ss')); // [4, 5]
console.log(arr); // [0, 1, 2, 3, "ss", 6, 7, 8, 9]
位置方法
10、indexOf
参数:要查找的项和(可选)查找起始位置索引
返回值:如果在原数组中找到了该项,返回该项在数组中的位置索引;如果没有找到,返回 -1
是否改变原数组:否
console.log(arr.indexOf(2)); // 2
11、lastIndexOf
参数:要查找的项和(可选)查找起始位置索引
返回值:如果在原数组中找到了该项,返回该项在数组中的位置索引;如果没有找到,返回 -1
是否改变原数组:否
使用方法和indexOf类似,只是从数组末尾向前查找
迭代方法
迭代方法的参数都是函数(三个参数,数组某项、索引、原数组)
都不会影响原数组
支持的浏览器:IE9+、 Firefox 2+、Safari 3+、 Opera 9.5+、Chrome
12、every
参数:
返回值:遍历数组每一项,如果每一项都返回true,则返回true
是否改变原数组:否
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.every((item, index, array)=>{
return item>=0;
})
console.log(result); // true
13、filter
参数:
返回值:遍历数组每一项,返回符合函数的值组成的数组
是否改变原数组:否
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.filter((item, index, array)=>{
return item>5;
})
console.log(result); // [6, 7, 8, 9]
14、forEach
对数组每一项运行传入的函数,本质上和for循环迭代数组一样
返回值:没有返回值
是否改变原数组:否
arr.forEach((item, index, array)=>{
// 执行操作
})
15、map
参数:
返回值:返回每一项运行传入函数的运行结果组成的数组
是否改变原数组:否
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.filter((item, index, array)=>{
return item * 2;
})
console.log(result); // [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
16、some
参数:
返回值:只要有一个符合传入函数,则返回true
是否改变原数组:否
和every相反
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.some((item, index, array)=>{
return item > 2;
})
console.log(result); // true
归并方法
支持的浏览器:IE9+、 Firefox 3+、Safari 4+、 Opera 10.5+、Chrome
17、reduce
参数:两个参数:第一个是在每一项上调用的函数,第二个是(可选)作为归并基础的初始值
传入函数的参数:上一个值、当前值、索引、原数组
返回值:从第一项开始迭代数组所有项,构建最终返回的值
是否改变原数组:否
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.reduce((prev, cur, index, array) => {
return prev + cur;
});
console.log(arr, result); //[1, 2, 3, 4, 5, 6, 7, 8, 9] 45
18、reduceRight
参数:两个参数:第一个是在每一项上调用的函数,第二个是(可选)作为归并基础的初始值
返回值:从最后一项开始迭代数组所有项,构建最终返回的值
是否改变原数组:否
用法和reduce类似
ES6扩充
1、扩展运算符(spread)
格式:...
将数组转成逗号分割的参数序列
该运算符主要用于函数调用
2、Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
3、Array.of方法用于将一组值,转换为数组
弥补new Array的缺陷
网友评论