ES6中的数组
数组是js中很重要的数据类型,虽然在 ES5 中,关于数组的方法和属性很多。但为了更加简洁、高效的操作数组,ES6 中又在数组原型上和实例上新增了一些方法。
一、Array方法
1.1 Array.from()
js中存在很多类似数组的对象,比如说 获取的一组DOM元素,比如说 函数的参数。
它们有着类似数组的属性,比如说键值对,或者 length 属性,但它们并不能使用数组里的方法。
要把一个类似数组的对象转换成一个真正的数组有时候可能很麻烦,就拿 函数的参数 来说,你需要通过如下方式:
function () { |
你也可以通过另外一种方式来转换数组,我们再拿 一组DOM元素 来说:
<ul> |
var li = document.querySelectorAll('li'); |
虽然上面两种方式都能实现转换成数组的目的,但是因为需要各种代码‘模拟’,我们还是觉得有些繁琐。因此,ES6 中提供了 Array.from()
方法,它有一个参数,即类似数组对象,它的返回值为一个数组。
如果传入的是其他值,Array.from()
会做一些特殊处理:
- 参数为 数组, 则该方法返回原数组
- 参数为 字符串, 则该方法返回字符串以空格拆分的数组
- 参数为 数字,则该方法返回空数组
- 参数为 NaN,则该方法返回空数组
- 参数为 其他数据类型,则该方法报错
用代码来说明下:
var li = document.querySelectorAll('li'); console.log(Array.from({'0': 5, '1': 10, length: 2})); // [5, 10] |
1.2 Array.of()
我们通常使用 Array()
方法来创建新数组(其实都是直接使用 []
):
console.log(Array()); // [] console.log(Array(3)); |
从上面的代码可以发现,Array()
传入的情况不同,返回的值也有很大差异:
- 不传参数时,返回的是空数组。
- 参数为 一个数字,则表示创建包含该数字项长度的数组,其中数组的每项都是 undefined。
- 参数为 一个字符串,则直接返回包含该字符串,且数组长度为1的数组。
- 参数为 多项,则直接返回包含这些项,对应的数组。
额,就因为传入的参数不同,就返回各种各样的结果。这很容易让人混淆好吗?而且你也不太可能记录各种传参的情况以及对应的返回值吧。
还好,ES6中引入了 Array.of()
方法。 无论你传入怎样的参数,它都是创建一个 “对应” 的数组。来看看它的使用:
console.log(Array.of()); // [] console.log(Array.of(3)); // [3] |
二、数组实例方法
2.1 find()、findIndex()
如果要查询数组中的符合条件的某一项,你通常的做法是:
- 循环整个数组
- 逐个匹配该项是否满足条件
- 把满足条件的数组项返回出来
有点繁琐?的确如此。 ES6 中 find()
方法可以把你从里面解脱出来,该方法用于查询符合条件的第一个数组项,它的参数是一个回调函数,函数里设置查找规则。
它的用法:
var positiveNumber = function(value) { |
除了 数组项 外,这个回调函数还接受另外两个参数:索引值 和 原数组
var positiveNumber = function(value, index, arr) { |
不过我觉得这个方法设计的有点奇怪,它为什么不是返回一个符合条件的数组呢?如果需要对符合条件的多个数组项同时操作怎么办?循环使用 find
?
我们再来说说 findIndex()
方法,它的作用是返回第一个符合条件的数组项的索引位置。如果没有找到则返回 -1 ,它的用法和参数与 find()
相同:
var positiveNumberIndex = function(value, index, arr) { |
2.2 fill()
fill 在字面上是填充的意思,所以 fill()
就表示通过一个或多个参数,来填充(覆盖)原始数组里的数组项。
当只传递一个参数时,该函数会用这个参数重写所有数组项:
console.log([2, 3, -1].fill(1)); // [1, 1, 1] |
在某些情况下,你可能不想替换数组里的所有项,这时,你可以给它传递一个开始索引和一个结束索引,即该函数的第二个或第三个参数:
console.log([2, 3, -1, 0].fill(1, 1)); // [2, 1, 1, 1] |
看到没,当传递了第二个参数后,则该参数索引在数组中后面的所有项都被替换。当传递了第三个参数后,那么就设置了一个替换范围。当同时传递后面这两个参数时,它的功能就有点类似之前操作数组的 splice
方法。但是,它似乎比 splice
方法功能更强大些。
需要注意的是,如果后面两个参数为负数,则需要将这个负数加上数组的长度,从而得到正确的索引位置。
2.3 copyWithin()
copyWithin
方法和前面说的 fill()
方法类似,主要功能还是更新替换数组项,但是它更强调复制功能,它是通过复制数组里的某一项或某几项来替换数组项。
它有三个参数:
- target,必选,表示开始替换数组项的索引。
- start,可选,表示从该索引数组项开始复制数据,默认值为 0。
- end,可选,表示从该索引数组项结束复制数据,默认值为数组长度。
console.log([2, 3, -1, 0].copyWithin(1)); // [2, 2, 3, -1] |
第一行代码只要一个参数,表示从数组第 1 项开始替换,复制的数据是从第 0 项到 最后 一项。
第二行代码有两个参数,表示从数组第 1 项开始替换,复制的数据是从第 2 项到 最后 一项。
第三行代码有三个参数,表示从数组第 1 项开始替换,复制的数据是从第 2 项到第 3 项。
需要注意的是,数组里的操作,第二个索引大多数都是不包含在内的,它的作用只是限定一个范围而已。
2.4 entries(),keys()、values()
通过 entries()
, keys()
和 values()
方法,ES6 中还新增了数组中键值对、键、值的循环。这三个方法返回的值,内部都是一种 ArrayIterator 结构,无法直接读取。
entries()
循环键值:
var arr = ['a', 'b', 'c'], |
当然,如果你了解 ES6 的迭代器的话,你也可以直接循环出来:
var arr = ['a', 'b', 'c'], |
keys()
循环键:
var arr = ['a', 'b', 'c'], |
values()
循环值:
var arr = ['a', 'b', 'c'], |
对于 values()
方法,浏览器支持性可能弱一些。在写本片文章时,我用的chrome 54 版本进行测试的,但该方法返回的却是 arr.values is not a function
。
ES6中的数组的更多相关文章
- ES6中对数组的扩展
hello,大家好,我又来了. 前面讲了字符串和数值的扩展,今天要讲的是:数组的扩展.不知道大家能否跟得上这个节奏,你们在阅读中对讲解有存在疑惑,记得留言提出来,要真正地理解,否则白白 ...
- ES6中的数组方法扩展
上一篇文章小编简单介绍了在ES6中,一些常用的方法和一些简单的应用,在这篇文章中,小编将针对ES6中数组常用方法进行扩展,相信经过这篇文章之后,每一位小伙伴下班时间会有所提前,就算从原来的996变成9 ...
- ES6中的数组常用方法
数组在JS中虽然没有函数地位那么高,但是也有着举足轻重的地位,下面我就结合这ES5中的一些常用的方法,与ES6中的一些方法做一些说明和实际用途.大家也可以关注我的微信公众号,蜗牛全栈. 一.ES5中数 ...
- ES6中的数组reduce()方法详解
reduce() 方法对数组中的每个元素执行一个由我们提供的reducer函数(升序执行),将其结果汇总为单个返回值. 1. 语法reduce说明 arr.reduce(callback(accumu ...
- ES6中有关数组的一些新操作
1.Array.isArray() 用于确定传递的值是否是一个 Array. Array.isArray([1, 2, 3]); // true Array.isArray({foo: 123}); ...
- es5和es6中查找数组中的元素
let array = [1,2,3,4,5] //es5 let find = array.filter(function (item){ return item %2 === 0//返回满足条件的 ...
- 利用ES6中的Array.find/ Array.findIndex来判断数组中已存在某个对象
前端开发过程中,我们会经常遇到这样的情景:比如选中某个指标obj,将其加入到数组checkedArr中({id: 1234, name: 'zzz', ...}),但是在将其选中之前要校验该指标是否已 ...
- ES6中数组新增的方法-超级好用
Array.find((item,indexArr,arr)=>{}) 掌握 找出第一个符合条件的数组成员. 它的参数是一个回调函数,对所有数组成员依次执行该回调函数. 直到找出第一个返回值为t ...
- ES6新特性-------数组、Math和扩展操作符(续)
三.Array Array对象增加了一些新的静态方法,Array原型上也增加了一些新方法. 1.Array.from 从类数组和可遍历对象中创建Array的实例 类数组对象包括:函数中的argumen ...
随机推荐
- 控制台输出<迷你DVD管理>
使用顺序.选择.循环.跳转语句 数组 功能实现菜单显示和切换 输入的数字不符合要求直接退出程序 用户可以选择新增.查看. 删除.借出.归还.退出 思路分析 使用switch语句实现菜单选择 使用do- ...
- D. Coloring Edges
You are given a directed graph with
- 问题:pip命令安装好的库,pycharm却显示没有这个库
问题: 今天发现pycharm内部安装库出了问题,导致无法安装各种库,我就在cmd下用自己安装好的pip安装各个库,成功安装后发现各个库在idle中可以成功的import,但在pycharm里却显示没 ...
- (转)Navicat Premium 12.1.8.0安装与激活
http://www.mamicode.com/info-detail-2493067.html
- Docker系列八: 数据卷
什么是数据卷 生成环境中使用docker的过程中,往往需要对数据进行持久化,或者需要多个容器之间进行数据共享,这个就涉及到了容器数据管理 容器中管理数据主要有两种方式: 数据卷:容器内数据之间映射到本 ...
- linux 上安装 java
一.源码安装 1.本地下载 java, 并上传到 linux 上 2.解压文件 tar -zxvf jdk-7u72-linux-i586.gz 3.配置环境变量 vi /etc/profile ...
- vue实现动态绑定class--(三目运算符)根据span数字内容改变其样式
一.根据span数字内容改变数字本身样式(两种样式) <template> //使用三目运算符,判断当span的val是否小于0给其不同的class名 <span class=&qu ...
- Linux修改主机名称方法
碰到这个问题的时候,是在安装Zookeeper集群的时候,碰到如下问题 java.net.UnknownHostException: XXXX Name or service not knownjav ...
- MOOC(12) - 安装连接数据库的第三方库
1.连接数据库需要mysql-python驱动,可以官网下载离线安装包 安装 检查是否导入成功
- HotSpot Java对象创建,内存布局以及访问方式
内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...