ES5中对数组的操作方法还不完善,对于一些其他语言较常见的功能还需要用间接的方法去实现,因而在ES6有力的进行了改进,主要有以下几个方面:
一、创建数组上的改进
在ES5及以前,创建数组的方式有两种,一种是调用Array构造函数,另一种是用数组字面量方式。这两种方法,均需列举数组中的元素,功能受限。例如想将一个类数组对象转换为数组,可选的方法有限,需要编写额外的代码。但在ES6中,这种转换将非常方便。
(一)Array.of()方法
1.ES5的构造函数方法会造成模糊结果
let item1=new Array(2);//当只传入一个数字时,会被当作是数组长度,而不会当作元素,除非传入的是"2"字符
console.log(item1.length);//输出结果:2
console.log(item1[0]);//输出结果:undefined
console.log(item1[1]);//输出结果:undefined
let item2=new Array(“2”);//当只传入字符“2”时,则会当作元素
console.log(item2.length);//输出结果:1
console.log(item2[0]);//输出结果:2
console.log(item2[1]);//输出结果:undefined
let item3=new Array(2,3);//而当只传入两个以上数字或字符时,则会被当作元素
console.log(item3.length);//输出结果:2
console.log(item3[0]);//输出结果:2
console.log(item3[1]);//输出结果:3
2.Array.of()方法用于解决构造函数造成模糊问题
Array.of()方法,不管传入什么参数,都自动当作元素,没有单一数值当作定义数组长度问题
let items= Array.of(2)
console.log(items.length);//输出结果:1
console.log(items[0]);//输出结果:2
console.log(items[1]);//输出结果:undefined
(二)Array.from()方法
Array.from()用于将非数组对象和可迭代对象转换为数组。
1. Array.from()方法将非数组对象转换为数组
如函数的arguments就是一种类数组对象,在ES5中要将其转换为数组,要采用间接方法得到,方法如下:
function makeArray(arrayLike){//间接方法得取得数组,再将数组返回进行复制
var result=[];
for(var i=0;i<arrayLike.length;i++){
result.push(arrayLike[i]);
}
return result;
}
function doSomeThing(par1,par2,par3){//通过调用间接方法,得到该函数的参数数组
var args=makeArray(arguments);
console.log(args);
}
doSomeThing(34,45,23);//输出结果:[34,45,23]
而在ES6中,只需要Array.from()方一条语句即可实现:
function doSomeThing(par1,par2,par3){//通过一条语句,得到该函数的参数数组
var args=Array.from(arguments);
console.log(args);
}
doSomeThing(34,45,23);//输出结果:[34,45,23]
2.Array.from()方法的映射转换
Array.from()还可以对转换的数组进行进一步运算加工,其方法是提供一个映射函数作为Array.from()方法的第二个参数。
function translate(){
return Array.from(arguments,value=>value+1);
}
let numbers=translate(1,2,3);
console.log(numbers);//输出结果:[2,3,4]
如果用映射函数处理对象加工,也可以给Array.form()方法传入第三个参数,表示映射函数的this值,如下。
let helper={
diff:1,
add(value){
return value+this.diff;
}
};
function translate(){
return Array.from(arguments,helper.add,helper);
}
let numbers=translate(1,2,3);
console.log(numbers);//输出结果:[2,3,4]
2.Array.from()方法将可迭代对象转换为数组
let numbers={
*[Symbol.iterator](){//创建可迭代对象
yield 1;
yield 2;
yield 3;
}
};
let number2=Array.from(numbers,value=>value+1);
console.log(number2);//输出结果:[2,3,4]
二、为数组添加的新方法
主要有四个新方法,find()方法和findIndex()方法可以用于在数组中查找任意值,解决了ES5中只能通过遍历来查找序号及值;fill()方法和copyWithin()方法主要用来对数组进行分解式的复制。
(一) find()方法和findIndex()方法
find()方法和findIndex()方法这两个方法是对ES5中的indexOf()和lastIndexOf()两个方法,进行了扩展,加入了回调函数功能,可以实现更为复杂的查找功能。indexOf()和lastIndexOf()虽然可以查找特定的值,但每次只能查找一个值相等式匹配,对于有复杂的条件匹配,如查找大于35的偶数值,就无法用一条语句实现,还需要编写更多赋值判断代码才完成。而ES6中的find()方法和findIndex()方法则可轻松实现。
find()方法和findIndex()方法都接受两个参数,一个是回调函数,另一个是可选参数,用于指定回调函数中的this值。两者的区别是,find()方法返回查找到的值,findIndex()方法返回的是值的索引。这四个搜索函数都一样,当查找到第一个匹配条件时,立即停止搜索剩余部分。
let numbers=[25,30,35,40,45];
console.log(numbers.find(n=>n>33));//输出结果:35
console.log(numbers.findIndex(n=>n>33));//输出结果:2
(二) fill()方法和copyWithin()方法
1.fill()方法
fill()方法用于向数组中填充指定的值,当传入一个值时,它会重写数组中所有的值。
let numbers=[25,30,35,40,45];
numbers.fill(0);
console.log(numbers);//输出结果:[0,0,0,0,0]
如果只想改变某一部分的值,可以传入开始索引和不包含结束索引(不包括结束索引当前值)这两个参数,如下:
let numbers=[1,2,3,4];
numbers.fill(1,2);//从第2序号开始后所有元素传入1进行覆盖
console.log(numbers);//输出结果:[1,2,1,1]
let numbers1=[1,2,3,4];
numbers1.fill(0,1,3);//从第1序号开始到3序号(不包含3序号)传入0进行覆盖
console.log(numbers1);//输出结果:[1,0,0,4]
2.copyWithin()方法
copyWithin()方法用于从数组中复制元素的值,并粘贴到该数值指定位置进行覆盖。它有两个参数,一个是开始填充值的索引位置,另一个是开始复制值的索引位置。
let numbers=[1,2,3,4];
numbers.copyWithin(2,0);//从数组的0序号开始复制值,到2序号开始进行粘贴覆盖
console.log(numbers);//输出结果:[1,2,1,2]
let numbers1=[1,2,3,4];
numbers1.copyWithin(2,0,1);//从数组0序号开始复制值,到1序号停止复制值,然后粘贴到2序号开始进行覆盖
console.log(numbers1);//输出结果:[1,2,1,4]