ES6新标准下关于数组的几个实用改进功能介绍

ES5中对数组的操作方法还不完善,对于一些其他语言较常见的功能还需要用间接的方法去实现,因而在ES6有力的进行了改进,主要有以下几个方面:

一、创建数组上的改进

在ES5及以前,创建数组的方式有两种,一种是调用Array构造函数,另一种是用数组字面量方式。这两种方法,均需列举数组中的元素,功能受限。例如想将一个类数组对象转换为数组,可选的方法有限,需要编写额外的代码。但在ES6中,这种转换将非常方便。

(一)Array.of()方法

1.ES5的构造函数方法会造成模糊结果

let item1=new Array(2);//当只传入一个数字时,会被当作是数组长度,而不会当作元素,除非传入的是"2"字符

console.log(item1.length);//输出结果:2

console.log(item10);//输出结果:undefined

console.log(item11);//输出结果:undefined

let item2=new Array("2");//当只传入字符"2"时,则会当作元素

console.log(item2.length);//输出结果:1

console.log(item20);//输出结果:2

console.log(item21);//输出结果:undefined

let item3=new Array(2,3);//而当只传入两个以上数字或字符时,则会被当作元素

console.log(item3.length);//输出结果:2

console.log(item30);//输出结果:2

console.log(item31);//输出结果:3

2.Array.of()方法用于解决构造函数造成模糊问题

Array.of()方法,不管传入什么参数,都自动当作元素,没有单一数值当作定义数组长度问题

let items= Array.of(2)

console.log(items.length);//输出结果:1

console.log(items0);//输出结果:2

console.log(items1);//输出结果: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(arrayLikei);

}

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

相关推荐
Cutecat_2 小时前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
dsyyyyy11012 小时前
JavaScript变量
开发语言·javascript·ecmascript
qq_422152573 小时前
PDF 加水印工具怎么选?2026 年文档版权保护方案对比
前端·pdf·github
kyriewen3 小时前
手写 Promise.all、race、any:不到 30 行代码,解决并发异步的所有姿势
前端·javascript·面试
brucelee1864 小时前
OpenClaw 浏览器控制(Chrome MCP)完整教程
前端·chrome
ct9784 小时前
React 状态管理方案深度对比
开发语言·前端·react
胡志辉的博客4 小时前
深入浅出理解浏览器事件循环:从一道输出题讲到 Chrome 源码
前端·javascript·chrome·chromium·event loop
代码不加糖4 小时前
js中不会冒泡的事件有哪些?
前端·javascript·vue.js
懂懂tty5 小时前
Vue2与Vue3之间API差异
前端·javascript·vue.js
AI焦点5 小时前
跨越协议鸿沟:Tool Use状态机从Anthropic到OpenAI兼容体系的适配要点
前端·人工智能