ECMAScript6对数组进行了扩展,为数组Array构造函数添加了from()、of()等静态方法,也为数组实例添加了find()、findIndex()等方法。下面一起来看一下这些方法的用法。

Array.from()

Array.from()将类数组(array-like)对象与可遍历的对象转化为数组并返回。例如将dom节点集合转化为数组,以前我们可能都会这样写:

var divs = document.querySelectAll("div");
[].slice.call(divs).forEach(function (node) {
console.log(node);
})

现在我们可以这样写:

var divs = document.querySelectAll("div");
Array.from(divs).forEach(function (node) {
console.log(node);
})

上面两种写法基本上是相同的。

Array.from()也可以将ES6中新增的Set、Map等结构转化为数组:

// 将Set结构转化为数组
Array.from(new Set([1, 2, 3, 4])); // [1, 2, 3, 4] //将Map结构转化为数组
Array.from(new Map(["name", "zlw"])); // ["name", "zlw"]

字符串既是类数组又是可遍历的,所以Array.from()也可将字符串转化为数组:

Array.from("zlw"); // ["z", "l", "w"]

Array.from()还有两个可选参数,完整语法如下:

Array.from(obj, mapFn, thisArg)

mapFn其实就是数组的map方法,对数组的每个元素处理。thisArg是执行环境的上下文。  Array.from(obj, mapFn, thisArg) 等同于 Array.from(obj).map(mapFn, thisArg)。

Array.of()

Array.of()将其参数转化为数组。如:

Array.of(1, 2, 3); // [1, 2, 3]

我们知道用Array构造函数也可以实现同样功能:

Array(1, 2, 3) // [1, 2, 3]

他们的不同之处在于:

Array.of(3); // [3]

Array(3) // [undefined, undefined, undefined] 

当传入一个参数时,Array.of()会返回只有一个元素的数组,而Array()会返回长度为传入参数而元素都为undefined的数组。

Array.prototype.fill()

fill()方法用一个值填充数组给定开始和结束位置之间的的所有值,语法如下:

fill(value, start, end)

参数start、end是填充区间,包含start位置,但不包含end位置。如果省略,则start默认值为0,end默认值为数组长度。如果两个可选参数中有一个是负数,则用数组长度加上该数来确定相应的位置。例:

[1, 2, 3].fill(4) // [4, 4, 4]
[1, 2, 3].fill(4, 1, 2) // [1, 4, 3]
[1, 2, 3].fill(4, -3, -2) // [4, 2, 3]

Array.prototype.find()与Array.prototype.findIndex()

find()方法返回数组中符合条件的第一个元素,如果没有则返回undefind。语法如下:

array.find(callback, context);

参数包括一个回调函数和一个可选参数(执行环境上下文)。回调函数会遍历数组的所有元素,直到找到符合条件的元素,然后find()方法返回该元素。例:

[1, 2, 3, 4].find(function(el, index, arr) {
return el > 2;
}) // 3 [1, 2, 3, 4].find(function(el, index, arr) {
  return el > 4;
}) // undefined

findIndex()方法与find()方法用法类似,返回的是第一个符合条件的元素的索引,如果没有则返回-1。例:

[1, 2, 3, 4].findIndex(function(el, index, arr) {
return el > 2;
}) // 2 [1, 2, 3, 4].findIndex(function(el, index, arr) {
  return el > 4;
}) // -1

Array.prototype.entries()、Array.prototype.keys与Array.prototype.values()

entries()、keys与values都返回一个数组迭代器对象。例:

var entries = [1, 2, 3].entries();
console.log(entries.next().value); // [0, 1]
console.log(entries.next().value); // [1, 2]
console.log(entries.next().value); // [2, 3] var keys = [1, 2, 3].keys();
console.log(keys.next().value); // 0
console.log(keys.next().value); // 1
console.log(keys.next().value); // 2 var valuess = [1, 2, 3].values();
console.log(values.next().value); // 1
console.log(values.next().value); // 2
console.log(values.next().value); //

迭代器的next()方法返回的是一个包含value属性与done属性的对象,而value属性是当前遍历位置的值,done属性是一个布尔值,表示遍历是否结束。

我们也可以用for...of来遍历迭代器:

for (let i of entries) {
console.log(i)
} // [0, 1]、[1, 2]、[2, 3]
for (let [index, value] of entries) {
console.log(index, value)
} // 0 1、1 2、2 3 for (let key of keys) {
console.log(key)
} // 0, 1, 2
for (let value of values) {
console.log(value)
} // 1, 2, 3

Array.prototype.copyWithin()

copyWithin()方法语法如下:

arr.copyWithin(target, start, end = this.length)

最后一个参数为可选参数,省略则为数组长度。该方法在数组内复制从start(包含start)位置到end(不包含end)位置的一组元素覆盖到以target为开始位置的地方。例:

[1, 2, 3, 4].copyWithin(0, 1) // [2, 3, 4, 4]

[1, 2, 3, 4].copyWithin(0, 1, 2) // [2, 2, 3, 4]

如果start、end参数是负数,则用数组长度加上该参数来确定相应的位置:

[1, 2, 3, 4].copyWithin(0, -2, -1) // [3, 2, 3, 4]

需要注意copyWithin()改变的是数组本身,并返回改变后的数组,而不是返回原数组的副本。

数组推导(array comprehensions)

数组推导就是利用for...of循环基于现有的数组生成新数组。例:

[for (i of [1, 2, 3]) i * i]  // [1, 4, 9]

数组推导允许使用if语句:

// 单个if语句
[for (i of [1, 2, 3]) if (i < 3) i] // [1, 2] //多重if语句
[for (i of [1, 2, 3]) if (i < 3) if (i > 1) i] // [2]

需要注意的是for...of总是写在最前面。

数组推导也允许使用多重for..of循环:

[for (i of [1, 2, 3]) for (j of [4, 5, 6]) i * j] // [4, 5, 6, 8, 10, 12, 12, 15, 18]

数组推导中还可以包含数组推导:

[for (i of [1, 2, 3]) [for (j of [4, 5, 6]) i * j]] // [[4, 5, 6], [8, 10, 12], [12, 15, 18]]

各大浏览器对ES6的支持可以查看kangax.github.io/es5-compat-table/es6/

ES6对数组的扩展的更多相关文章

  1. ES6对数组的扩展(简要总结)

    文章目录 数组的扩展(ES6) 1. 扩展运算符 2. Array.from 3. Array.of() 4. copyWithin() 5. find() 和 findIndex() 6. fill ...

  2. ES6 之 数组的扩展

    ES5 检测数组 let arr = [1,2,3,4] Array.isArray(arr) arr instanceof Array 转换方法 arr.toLocaleString() arr.t ...

  3. 【ES6】数组的扩展——扩展运算符

    1.扩展运算符[三个点(...)将一个数组转为用逗号分隔的参数序列] 作用:用于函数调用 function add(x, y) { return x + y; } const numbers = [2 ...

  4. 【ES6】数组的扩展

    1.Array.from(): 将伪数组对象和遍历的对象转为真数组 如果一个对象的键都是正整数或者0,并且有 Length属性,那么这个对象很想数组,称它为伪数组. 伪数组: let obj = { ...

  5. 数组的复制及ES6数组的扩展

    一.数组的复制 // alert([1,2,3]==[1,2,3]); let cc = [0,1,2]; let dd = cc; alert(dd==cc);//此时改变dd会影响cc ES5 只 ...

  6. es6数组的扩展

    数组扩展运算符 ...(三个点) const demoArr=[0,1,2,3,4] console.log(...demoArr) // 0 1 2 3 4 // 他把一个数组用逗号分隔了出来 // ...

  7. ES6的新特性(8)——数组的扩展

    数组的扩展 扩展运算符 含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) / ...

  8. ES6学习(三):数组的扩展

    chapter08 数组的扩展 8.1 扩展运算符 8.1.1 扩展运算符的含义 ... 如同rest运算符的逆运算,将一个数组转换为用逗号分隔的参数序列. console.log(...[1, 2, ...

  9. Es6学习笔记(7)----数组的扩展

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 数组的扩展 1.扩展运算符:可以将数组转化成逗号隔离的单个参数...[1,2,3] //控制台运 ...

随机推荐

  1. python制作验证码

    from PIL import Image, ImageFont, ImageDraw, ImageFilterfrom random import choice, randint # 随即配置颜色d ...

  2. Fpm启动机制及流程分析———详细

    FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器,从它的定义可以看出,FPM的核心功能是进程管理,那么它用来管理什么进程呢?这个问题就需要从Fa ...

  3. pomelo vscode 调试配置

    步骤 config/server.js 配置 .vscode/launch.json 配置 详细 1. 在server的配置中添加 args 参数,此参数为node开启此服务器时命令参数 " ...

  4. Hadoop源码学习笔记之NameNode启动场景流程三:FSNamesystem初始化源码剖析

    上篇内容分析了http server的启动代码,这篇文章继续从initialize()方法中按执行顺序进行分析.内容还是分为三大块: 一.源码调用关系分析 二.伪代码执行流程 三.代码图解 一.源码调 ...

  5. 树莓派3B+学习笔记:12、安装FireFox浏览器

    1.在终端中输入 sudo apt-get install iceweasel 2.安装完成后菜单中会自动生成快捷方式 什么是 iceweasel? Iceweasel 是 Firefox(火狐浏览器 ...

  6. 20155320 《Java程序设计》实验五网络编程与安全实验报告

    20155320 <Java程序设计>实验五网络编程与安全实验报告 实验内容 实验一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...

  7. Linux 用C语言实现简单的shell(1)

    发一波福利,操作系统的实验内容,大家可以借鉴一下,不过我的代码可能也存在一定的问题. 因为在一开始老师是一节一节课教的,当时并不知道后面还会用输入输出重定向,管道等一系列问题,我的兴趣也不在这个方面也 ...

  8. installshield 判断mdmcpq.inf和usbser.sys 是否 存在

    1.产品上位机程序,需要驱动支持,在安装  exe程序的时候,连同NET框架4.0和 .inf驱动文件,一起安装, 安装驱动的时候,会发现, 如果系统 C:\Windows\Inf 缺少mdmcpq. ...

  9. 【转】odoo学习之:API整合文档

    Odoo8.0新API文档 一.新API概述 在8中,api接口分为traditaional style和record style,traditional style指的就是我们在7中使用的类型,de ...

  10. day7 opencv+python 读取视频,没有东西

    1.读取视频man.avi, 报错. 我的视频和文件在同一目录下. #coding=utf-8 import numpy as np import cv2 cap = cv2.VideoCapture ...