ECMAScript6(6):数组的扩展

2023-05-16

数组的扩展

  • Array, from()
    将类数组对象和可遍历对象转化为真正的数组。
var arrayLike = {
  '0' : 'a',
  '1' : 'b',
  '2' : 'c',
  'length': 3
}

var arr;
//ES5
arr = [].slice.call(arrayLike);    //arr=['a', 'b', 'c']

//ES6
arr = Array.from(arrayLike);    //arr=['a', 'b', 'c']

和它类似的是扩展运算符, 一样可以实现该功能(要求对象具有遍历器接口):

function(){
  var arg = [...arguments];   //转化 arguments 为数组
}

Array.from() 接受第二参数(函数), 用来映射结果, 相当于 map, 并且可以用第三个参数绑定 this:

Array.from(obj, func, context);
//等价于
Array.from(obj).map(func, context);

技巧, 用 Array.from() 指定函数运行次数:

var i = 0;
Array.from({length: 3}, ()=>i++);   //[0, 1, 2]

建议:使用Array.from方法,将类似数组的对象转为数组。

  • Array.of()
    将多个值组成数组:
Array.of(2, 3, 5);   //[2, 3, 5]
Array.of(2);   //[2]
Array.of();   //[]
Array.of(undefined);   //[undefined]
  • Array.prototype.copyWithin()
    函数参数是 Array.prototype.copyWithin(target, start=0, end=this.length), 对当前数组, 从截取下标为 start 到 end 的值, 从target 位置开始覆盖 this 中的值。如果 start 或 end 为负数则倒数。
[1, 2, 3, 4, 5].copyWithin(0, 3, 4);   //[4, 2, 3, 4, 5]

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

[].copyWithin.call({length: 5, 3: 1}, 0, 3);   //{0: 1, 3: 1, length: 5}

var i32a = new Int32Array([1, 2, 3, 4, 5]);
i32a.copyWithin(0, 2);   //[3, 4, 5, 4, 5]
  • Array.prototype.find(), Array.prototype.findIndex()
    这两个函数的参数都是回调函数。遍历数组, 找到符合条件(回调函数返回为true)的第一个值, find()返回其值, findIndex()返回其下标。如果没找到符合条件的值find()返回undefined, findIndex()返回-1。
[1, 2, -3, 4].find((item) => item < 0);   //-3
[1, 2, -3, 4].findIndex((item) => item < 0);   //2

[NaN].findIndex(y => y !== y);   //0
[NaN].indexOf(NaN);   //-1, indexOf 找不到 NaN

这两个函数还接受第二参数, 用来绑定回调函数中的 this

  • Array.prototype.fill()
    完整形式: Array.prototype.fill(value, start=0, end=this.length), 对数组 start 到 end 直接部分填充 value, 覆盖原有值。
[1, 2, 3, 4, 5].fill('a', 2, 4);    //[1, 2, 'a', 'a', 5];
var arr = new Array(5).fill(0);   //arr = [0, 0, 0, 0, 0];
  • Array.prototype.entries(), Array.prototype.keys(), Array.prototype.values()
    这三个方法, 用来遍历数组, 返回一个遍历器, 供 for...of 使用, 其中 keys()是对键的遍历, values() 是对值的遍历, entires()是对键值对的遍历。babel 已实现
var a = ['a', 'b', 'c'];

for(let item of a.values()){
  console.log(item);     //依次输出 'a', 'b', 'c'
}

for(let key of a.keys()){
  console.log(key);     //依次输出 0, 1, 2
}
for(let pair of a.entries()){
  console.log(pair);     //依次输出 [0, 'a'], [1, 'b'], [2, 'c']
}

当然也可以用遍历器的 next() 方法遍历

var a = ['a', 'b', 'c'];
var values = a.values();
console.log(values.next().value);   //'a'
console.log(values.next().value);   //'b'
console.log(values.next().value);   //'c'
  • Array.prototype.includes()
    这是个 ES7 的方法, 判断数组中是否含有某个值, 含有则返回 true, 否则返回 false。可以用第二个参数指定查找起始点(小于0倒数)。
//该方法同样可以找到 NaN, 而 indexOf 不行
[1, 2, NaN].includes(NaN);   //true
[1, 2, 3, 4, 5].includes(2, 3);  //false
  • 数组的空位
    我们比较以下两个数组:
var empty = new Array(3);  //[, , , ]
var unempty = new Array(3).fill(undefined);   //[undefined, undefined, undefined]

console.log(0 in empty);     //false
console.log(0 in unempty);   //true

结合手册内容如下就很好理解这个问题:

“Array elements may be elided at the beginning, middle or end of the element list. Whenever a comma in the element list is not preceded by
an AssignmentExpression (i.e., a comma at the beginning or after another comma), the missing array element contributes to the length of the
Array and increases the index of subsequent elements. Elided array elements are not defined. If an element is elided at the end of an array,
that element does not contribute to the length of the Array.”
摘自ECMAScript® 2015 Language Specification

翻译如下。

“数组成员可以省略。只要逗号前面没有任何表达式,数组的length属性就会加1,并且相应增加其后成员的位置索引。被省略的成员不会被定
义。如果被省略的成员是数组最后一个成员,则不会导致数组length属性增加。”

很明显, 一个完全空的数组是没有东西的, 而填充了undefined的数组并不是空的。
结合 ES5, 发现不同函数方法对空位处理方式是不一样的:

  • forEach(), filter(), every(), some() 会忽略空值
  • map(), copyWithin() 会保留空值, 但不做处理
  • join(), toString(), 会把空值处理为空字符串
  • fill() 不区分空值与非空值
  • Array.from(), 扩展运算符(…), for...of, entires(), keys(), values(), find(), findIndex() 会视空值为 undefined

如果你记不住这些, 或者为了程序的健壮性, 可维护性, 尽量避免在数组中出现空值。
举个实例, 理解一下这个问题:

新建一个长为200的数组, 并初始化每个位置的值等于其索引

//错误方法
var arr = new Array(200).map(function(item, index){
  return index;
});
console.log(arr);    //[undefined × 200]
//正确做法
var arr = new Array(200).join().split(',').map(function(item, index){
  return index;
});
console.log(arr);    //[1, 2, 3, ..., 200]
  • 数组推导
    这是一个 ES7 的功能, 暂时还没能实现。我们可以先看一下它如何推导的:
var a1 = [1, 2, 3, 4];
var a2 = [for( i of a1) i * 2];   //a2=[2, 4, 6, 8]

不难看出, 数组 a2 通过 for...of 直接从 a1 生成。但是它的功能不仅仅这么简单, 还可以有 if 条件:

var a1 = [1, 2, 3, 4];
var a3 = [for( i of a1) if(i > 2) i * 2];   //a3=[6, 8]

这样, 我们可以简单的用数组推导模拟 map(), filter() 方法了。比如上面2个例子等价于:

var a1 = [1, 2, 3, 4];
var a2 = a1.map( (i) => i * 2 );
var a3 = a1.filter( (i) => i > 2 ).map( (i) => i * 2 );

当然我们还可以用多个 for...of 构成循环嵌套:

var a = ['x1', 'x2'];
var b = ['y1', 'y2'];

[for(i of a) for(j of b), console.log(i+', '+j)];
//输出
//['x1', 'y1']
//['x1', 'y2']
//['x2', 'y1']
//['x2', 'y2']

数组推导由 [] 构建了一个作用域, 其内部新建的变量, 等同于用 let 关键字声明的变量。除此之外, 字符串也可以被视为数组, 所以同样可以使用数组推导:

[for(c of 'abcde'). c+'.'].join('');  //"a.2.3.4.5."
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ECMAScript6(6):数组的扩展 的相关文章

  • ES6 静态方法引用 self? [复制]

    这个问题在这里已经有答案了 我有两节课 存储库和用户存储库 我想在 Repository 中定义一个静态方法 该方法在运行时调用 UserRepository 中的静态函数 有什么干净的方法可以做到这一点吗 class Repository
  • React:搜索过滤器无法正常工作

    我通过 API 从服务器获取记录 API 是在 Loopback 中构建的 实际上 我在每个页面上显示 5 条记录 目前工作正常 我可以导航next or prev通过分页按钮 每页显示 5 条记录 问题是 当用户在搜索框中键入内容时 记录
  • 为什么方法引用不跟踪这一点?

    我正在使用 Babel 来转译 ES2015 类 class Foo constructor foo this foo foo sayFoo console log this foo 如果我说这样的话 这个课程的效果就完全符合我的预期foo
  • .map() Javascript ES6 地图?

    你会怎么做 本能地 我想做 var myMap new Map thing1 1 thing2 2 thing3 3 wishful ignorant thinking var newMap myMap map key value gt v
  • React Native:访问静态函数内的组件状态

    我有一个这样定义的组件 export class A extends Component constructor props this state scene 0 static changeScene scene this setState
  • JavaScript 符号并不能阻止对象中的名称冲突

    我已经开始研究 JavaScript 中的符号 并开始在我的对象中使用它们来帮助解决名称冲突 但是在使用它们时我仍然可以覆盖属性吗 我很难理解 JavaScript 中符号的意义 它们被谈论了很多 人们说它们很聪明 因为它们不会导致对象中的
  • ES6 模块范围

    我有代码 lib js var a a export var b b main js console log a a variable is not available in a global scope import b from lib
  • 从 ES6 模块导入函数表达式或函数声明有什么区别?

    据我了解 参见第 16 3 2 1 节 http exploringjs com es6 ch modules html ES6 允许函数 类导出操作数使用不同的语法 区别在于导出的函数是否需要在导入时解释为函数声明 在这种情况下 您可以编
  • 异步减少返回承诺

    我有一个对象数组 我必须为来自异步函数的每个对象添加一个属性 我正在执行 Array reduce 来迭代每个元素并仅返回一个结果 具有新属性的一个对象数组 我有这个 const res await resultOne reduce asy
  • 使用 babel env 预设时,展开运算符出现语法错误

    我正在努力 现代化 meern io 入门样板 https github com Hashnode mern starter通过替换巴别塔es2015 and stage 0预设为env 然而 似乎env预设无法识别以下片段client m
  • 是否有任何理由使用 axios 而不是 ES6 fetch [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 研究了 axios 和 ES6 fetch 的文档 我发现两者非常相似 并且都受到 ajax 及其简写的强烈影响 axios 的主要优点是浏览器
  • 获取类中的所有静态 getter

    假设我有这个类 我像枚举一样使用它 class Color static get Red return 0 static get Black return 1 有没有类似的东西Object keys to get Red Black 我使用
  • Array.from() 与扩展语法

    使用之间有什么区别吗Array from document querySelectorAll div or document querySelectorAll div 这是一个例子 let spreadDivArray document q
  • Babel NodeJS ES6:语法错误:意外的令牌导出

    我正在尝试使用 babel 来运行我的 NodeJS 程序 其中包括 ES6 语法和 Colyseus 库的导出 但是 当我运行命令时 babel node server js 出现以下错误消息 export class MyRoom ex
  • 如何检查 Map 或 Set 是否为空?

    对于 JavaScript 中的传统对象 使用以下命令很容易检查它是否为空 Object keys method const emptyObj console log Object keys emptyObj length 0 true i
  • Eslint errorring 导入没有扩展名的 jsx

    我正在尝试在 es6 中导入 jsx 文件而不需要 jsx 扩展名 import LoginErrorDialog from LoginErrorDialogView Not import LoginErrorDialog from Log
  • 语法错误:意外的静态标记

    我目前正在尝试评估与 React 配合使用的不同测试框架 结果发现 Jest 就在我的列表中 但是 我尝试使用此处概述的静态属性 https github com jeffmo es class fields and static prop
  • ES6模块导入是否执行导入文件内的代码?

    js 文件中的代码在导入期间是否运行 如果是 那么一次还是每次 例如 a js console log A const a a export default a b js import a from a gt console logs c
  • 运行“gulp”命令时出现“错误 [ERR_REQUIRE_ESM]”

    我是新来的Gulp并尝试自动化一些任务 这是我的环境设置 npm version 8 1 0 node version 17 0 1 gulp CLI version 2 3 0 and gulp version 4 0 2 这是我的gul
  • 是否可以将 ECMAScript 6 生成器重置为其初始状态?

    给定提供的 非常简单 生成器 是否可以将生成器返回到其原始状态以再次使用 var generator function yield 1 yield 2 yield 3 var iterable generator for let x of

随机推荐

  • ubuntu18.04安装mavros并读取pixhawk飞控数据

    Mavros源码安装 最新mavros详细安装教程 xff08 亲测可行 xff09 启动mavros 上述步骤完成后 xff0c 启动px4 launch roslaunch mavros px4 launch 此时rostopic li
  • 相机标定:相机模型和畸变模型

    一 相机标定方案 相机内参标定是确定内参和畸变参数 equidistqant畸变模型 或者 radial tangential模型 的过程 本文首先介绍SLAM中常用的相机模型和畸变模型 xff0c 随后介绍我们采用的两种内参标定方案 xf
  • 新手入门Docker之Windows下如何使用Docker

    Docker是什么 xff1f Docker 将应用程序与该程序的依赖 xff0c 打包在一个文件里面 运行这个文件 xff0c 就会生成一个虚拟容器 程序在这个虚拟容器里运行 xff0c 就好像在真实的物理机上运行一样 有了 Docker
  • C/C++服务器开发常见面试题(一)

    C C 43 43 服务器开发常见面试题 转自 xff1a LinuxC C 43 43 服务器开发面试题 一 编程语言 1 根据熟悉的语言 xff0c 谈谈两种语言的区别 xff1f 主要浅谈下C C 43 43 和JAVA语言的区别 1
  • Realsense D455/435内参标定以及手眼标定

    相机的内外参 内参数 与相机自身特性有关的参数 xff0c 焦距 xff0c 像素大小外参数 xff0c 相机的位置 xff0c 旋转方向 为什么要内参标定 理想情况下 xff0c 镜头会将一个三维空间中的直线也映射成直线 xff08 即射
  • 最新Ubuntu20.04安装指南(防踩坑版)

    文章目录 最新Ubuntu20 04安装 配置指南 防踩坑版 一 备份 1 Windows系统镜像 2 个人资料 3 一些杂项 二 启动盘UEFI引导1 启动盘制作2 设置以U盘方式启动 三 Ubuntu安装 最新Ubuntu20 04安装
  • 18.Python爬虫之Scrapy框架

    scrapy 框架 01 Scrapy 链接02 Scrapy 的爬虫流程03 Scrapy入门04 setting py文件中的常用设置4 1 logging模块的使用4 2 61 61 scrapy项目中的setting py常用配置内
  • 树莓派上手实战之SSH下配置VNC服务器实现远程桌面(可以实现开机自启动vncserver)

    VNC是linux下面常用的远程桌面 xff0c 用它可以在windows或者unix主机上方便的通过网络操作远程主机而不需要一个额外的显示器 xff0c 非常实用 这篇教程将会详细讲解安装配置VNC服务器开启远程桌面服务的全部过程 首先
  • N2N(docker方式安装)实现远程访问家里群晖

    N2N xff08 docker 安装 xff09 实现远程访问家里群晖 前言部署阿里云ECS安装n2n supernode 及 edge 节点在黑群晖上安装 edge节点windows 安装edge节点 测试遇到的问题检查tun模块状态测
  • 深入浅出话事件(下)

    深入浅出话事件 xff08 下 xff09 二 xff0e 事件的由来 在传统的面向对象的概念中是没有 事件 这个概念的 传统的面向对象概念中只有数据 xff08 Data xff0c 也称为 field 域 成员变量 xff09 和方法
  • 凤凰涅槃

    涅槃 xff0c 涅槃 xff0c 太阳般灿烂 xff0c 黑色的凤凰飞入烈火 xff0c 一切腐朽烧干 涅槃 xff0c 涅槃 xff0c 大海般坦然 xff0c 红色的凤凰浴火重生 xff0c 一切希望复燃 涅槃 xff0c 涅槃 xf
  • 转:make cmake和catkin_make的区别

    程序在cmake编译是这样的流程 cmake指令依据你的CMakeLists txt 文件 生成makefiles文件 make再依据此makefiles文件编译链接生成可执行文件 catkin make是将cmake与make的编译方式做
  • 前端开发踩坑-npm install 时报错---持续更新

    1 npm ERR fatal unable to access https github com adobe webplatform eve git Failed to connect to github com port 443 Ope
  • μC/OS II 任务调度详解(一)

    UC OS II 是一个多任务操作系统 xff0c 从宏观角度来看 xff0c 当前系统中可以有多个任务同时运行 xff1b 但从微观角度来看 xff0c 某一个时刻只能有一个任务处于运行状态 xff08 单CPU情况 xff0c 事实上在
  • IMU参数详解

    1 加速度计 1 1Full Scale Range 1 指加速度计能测量到的正反方向最大加速度的额定值范围 常见有 xff08 2g 4g 8g 16g up to 400g 2 地球重力加速度为1g 61 9 8m s 2 16g 61
  • Registry注册机制

    前言 不管是Detectron还是mmdetection xff0c 都有用到这个register机制 xff0c 特意去弄明白 xff0c 记录一下 首先看Registry代码 Copyright c Facebook Inc and i
  • 计算机网路:<3>连接外网(多层交换机)

    上一期我们讲到如何用多层交换机将不同的子网连接起来 xff0c 我们是用到了多层交换机的路由功能 xff0c 那么这个路由功能可以不以创建路由表并且与路由器相连 xff0c 与外网相连呢 xff1f 答案是肯定的 xff0c 这一期我们就做
  • c++ vector指针访问vector元素的方法

    c 43 43 使用 vector指针访问vector元素时 xff0c 不能简单的类似于c中数组和指针的方式 需要使用迭代器 int main vector lt int gt s vector lt int gt p 61 amp s
  • PHP中的设计模式及其实际应用浅析

    设计模式在各种语言中都有很重要的应用 xff0c 每种设计模式都有其特有的优点以及使用场景 接下来 xff0c 将从单例模式 工厂模式 组合模式以及策略模式四个模式 xff0c 介绍设计模式及其实际项目中的简单应用 一 单例模式 单例模式的
  • ECMAScript6(6):数组的扩展

    数组的扩展 Array from 将类数组对象和可遍历对象转化为真正的数组 span class hljs keyword var span arrayLike 61 span class hljs string 39 0 39 span