ES7 中的 Array.from 方法详解

JavaScript 作为一门动态语言,一直受到许多语言特性上的限制,尤其是数组的操作。为了解决这些限制,ES6 引入了许多新特性,比如模板字符串,解构赋值,箭头函数等。而在 ES7 中新增了一个新的静态函数——Array.from,该函数可以将类数组对象或可迭代对象转换为一个真正的数组。

Array.from 的用法

Array.from 函数接收两个参数:第一个参数 source,要转换的对象;第二个参数 mapFn,可选参数,对每个数组元素进行处理的函数。

---------------------- ------- ----------

Array.from 的例子

类数组对象

下面是一个常见的场景,需要将类数组对象转换为数组。可以直接传递类数组对象作为第一个参数给 Array.from,即可转换为一个数组。

----- --------- - - -- ---- -- ---- -- ---- ------- - --
----- --- - ----------------------
-- --- - ----- ---- ----

可迭代对象

除了类数组对象,Array.from 还可以转换可迭代对象,可迭代对象可以是一个 Set、Map、String、Array 等类型。这里以 Set 类型为例:

----- --- - --- ------- -- ----
----- --- - ----------------
-- --- - --- -- --

对元素进行处理

如果想对每个数组元素进行更高级、更复杂的处理,可以将处理函数传递给第二个参数 mapFn。 这个处理函数有两个参数:value 和 index,表示值和索引。然后,Array.from 会将每个元素逐个传递给这个函数进行处理,并将处理结果存储在新生成的数组中。

例如,将 Set 中每个数字乘以 2 并存储在数组中:

----- --- - --- ------- -- ----
----- --- - --------------- ----- -- ----- - ---
-- --- - --- -- --

与扩展运算符对比

那么,将一个可迭代对象转换为数组,Array.from 与 [...iterable](扩展运算符)有什么区别呢?可以看下面的例子:

----- --------- - - -- ---- -- ---- -- ---- ------- - --
----- ---- - ----------------------
----- ---- - --------------- -- ----------

----- --- - --- ------- -- ----
----- ---- - ----------------
----- ---- - ---------

扩展运算符只能用于可迭代对象,不能用于类数组对象;而 Array.from 既可以用于可迭代对象,也可以用于类数组对象。

类似数组的对象

有一些对象被称为“类似数组的对象”,它们看起来像一个数组,但是没有数组的方法(如 push、pop、slice 等)。在这些情况下,Array.from 的低效性可能会对性能产生负面影响,因为它通过一个 for 循环遍历。

可以使用 Array.from 的另一个变体,该变体同样接受一个映射函数,但是该函数放在可选参数之前,并且不接受源对象。相反,它将其索引作为第一个参数。例如,可以像这样使用 Array.from:

------------ ------- - -- --- -- -- ---
-- --- -- -- -- --

这可能看起来很奇怪,但它实际上是很高效的。它通过自己的迭代生成一个数组或类数组对象(具有“0”到“length-1”属性的对象),然后连续地映射并返回该数组。这是一个更高效的解决方案,因为它不需要通过循环进行迭代。此方法适用于将带有 for 迭代器的循环转换为用于生成数组的映射。

总结

Array.from 函数是 ES7 中新增的静态函数,用于将类数组对象或可迭代对象转换为一个真正的数组。它的基本用法非常简单,只需要将需要转换的对象作为第一个参数传递给数组即可。同时,它可以选取一个可选参数 mapFn,用于对每个数组元素进行处理。在使用时,我们需要根据具体情况选择使用 Array.from 还是扩展运算符来达到最佳效果。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64605828968c7c53b020d9f8


猜你喜欢

  • 聊聊 TypeScript 的 interface

    TypeScript 是一种静态类型检查的编程语言,它可以在开发阶段检测出代码中的类型错误,降低开发过程中的错误率。而 TypeScript 中的 interface 是一个非常重要的概念,它可以用来...

    1 年前
  • Mocha 测试框架中如何测试 Apache Spark

    Mocha 测试框架中如何测试 Apache Spark Apache Spark 是一种快速的通用引擎,用于大规模数据处理。在前端开发中,利用 Spark 实现数据分析和处理也是常见的应用场景之一。

    1 年前
  • 使用 PM2 进行 Node.js 应用的动态负载均衡

    前言 在现代 Web 应用中,动态负载均衡是非常重要的一环。它可以让我们有效地分配流量,并确保服务的可用性和可扩展性。 Node.js 是一个优秀的服务器端编程语言,它的异步、事件驱动设计使得它非常适...

    1 年前
  • Tree Shaking + Babel: 这么做是安全的吗?

    随着前端技术的不断发展,前端工程化成为了现代前端开发中的重要工具。其中,Tree Shaking 和 Babel 是常用的两种工具。Tree Shaking 是指通过静态分析来删除代码中未被使用的部分...

    1 年前
  • 使用 Cypress 进行 Go 应用测试的实践

    Cypress 是一款轻量级的前端自动化测试工具,它能够在浏览器中运行,提供了丰富的 API 和 UI 界面来进行测试操作。不仅如此,Cypress 还提供了许多实用工具和插件,可以快速便捷的进行测试...

    1 年前
  • Jest 测试 React 组件,如何 mock class?

    在 React 开发中,我们经常需要使用 Jest 来测试组件。当我们测试一个组件时,有时需要 mock 组件中的 class,让测试变得更加简单。 在本文中,我们将介绍如何使用 Jest 来 moc...

    1 年前
  • Jasmine + Enzyme 组测试 React

    前言 在前端开发过程中,自动化测试是不可或缺的一环。对于 React 技术栈来说,Jasmine 和 Enzyme 是非常流行的测试工具。Jasmine 是一个行为驱动的 JavaScript 测试框...

    1 年前
  • 如何处理 GraphQL 查询结果不正常返回

    GraphQL 是一种用于 API 的查询语言,它提供了一种更加灵活、高效的数据查询方式,因而越来越受到前端开发者的青睐。在使用 GraphQL 进行数据查询时,有时会出现查询结果不正常返回的情况,本...

    1 年前
  • Redis 集群数据分片策略详解

    前言 在实际的 Redis 集群应用中,数据量越来越大的情况下,如何保证高效的数据访问和高可用性越来越成为了一个重要的问题。而 Redis 集群数据分片则是保障 Redis 集群高效、高性能运行的一个...

    1 年前
  • 使用 Server-sent Events 实现实时在线课堂

    在现代 web 开发中,很多应用需要实现实时的数据更新以提供更好的用户体验。常见的实现方式有长轮询、WebSockets 和 Server-sent Events。

    1 年前
  • CSS Reset 与 Flexbox 布局的兼容及其解决

    前言 在开发前端页面时,各种布局方式都是我们需要掌握的技能,而 Flexbox 布局就是较为流行的一种,它可以帮助我们快速地实现各种复杂的布局效果。但是在实际开发中,我们经常会遇到兼容性问题,其中最常...

    1 年前
  • 升级 ESLint 扫描 ES6 代码

    在现代前端开发中,ES6 已经成为开发者们不可或缺的一部分,但是作为一种新的语言标准,其语法也需要经过相应的检查和分析才能保证代码质量和运行效果。这时候,我们就需要使用一个叫做 ESLint 的插件来...

    1 年前
  • Mongoose 中使用 $addToSet 对数组操作时的详解及注意事项

    MongoDB 是一个非常流行的 NoSQL 数据库,而 Mongoose 是对 MongoDB 进行封装的一个 Node.js 模块。在 MongoDB 中,我们经常会用到数组类型数据,在 Mong...

    1 年前
  • 使用 Socket.io 实现实时视频聊天的方法

    #使用 Socket.io 实现实时视频聊天的方法 技术的发展,给我们带来了前所未有的便利和创新。而在现代社会最为普及和依赖的便是网络通讯技术。视频通话也成为了人们生活中的一部分,无论是亲人、朋友,还...

    1 年前
  • ES2021(ES12)新特性之 Logical Assignment Operators

    近年来,前端技术发展迅速,在不断寻求更高效、更简洁的编码方式。在 ES2021(ES12)版本中,增加了一种利于代码简洁性的新特性,即 Logical Assignment Operators。

    1 年前
  • Sequelize 中的模型定义和关联详解

    前言 Sequelize 是一个 Node.js ORM(Object-Relational Mapping) 框架,它能够帮助我们很方便地与数据库交互。在使用 Sequelize 进行数据库操作时,...

    1 年前
  • 如何在 SASS 中定义自己的混合 (Mixins)?

    SASS 是一种 CSS 扩展语言,它可以让我们写出更加简洁、易于维护的 CSS 代码。其中一项最常用的功能是混合 (Mixins)。混合是由一组 CSS 属性和值组成的代码块,可以在样式表中重用,从...

    1 年前
  • Vuex 的状态管理 ——Getter

    Vuex 是 Vue.js 应用程序开发的状态管理模式。它充分利用了 Vue.js 的模块化机制,将应用程序中的所有组件状态集中处理,简化了应用程序的复杂度。Vuex 最重要的特性之一就是它提供了一个...

    1 年前
  • Flexbox 模块优化实践:如何减少重排重绘

    在前端开发中,Flexbox 是一种非常常见的布局模型。然而,使用 Flexbox 进行布局时,存在一些常见的性能问题:重排和重绘。这些问题会导致页面卡顿和响应速度变慢。

    1 年前
  • Next.js 项目中的标签云实现方法

    标签云是一种常见的网站内容展示方式,可以方便用户快速浏览和筛选相关内容。在 Next.js 项目中,可以利用 React 的组件化思想和 CSS 的灵活性实现标签云的效果。

    1 年前

相关推荐

    暂无文章