ZetCode

JavaScript from 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们探讨 JavaScript 中的 Array.from() 方法。它从类似数组或可迭代对象创建新数组。

from 关键字

Array.from() 是一个静态方法,它从类似数组或可迭代对象创建一个新的数组实例。它在 ES6 中引入,提供了一种更简洁的方式将对象转换为数组。

该方法接受三个参数:源对象,一个可选的映射函数,以及一个可选的用于映射函数的 this 值。它适用于 NodeLists、字符串、Sets、Maps 和类似数组的对象等对象。

与展开运算符不同,Array.from() 可以处理没有迭代器方法的类似数组的对象。它对于 DOM 操作和处理函数参数特别有用。

Array.from() 的基本用法

Array.from() 最简单的用法是将类似数组的对象转换成数组。

main.js
const str = 'hello';
const arr = Array.from(str);
console.log(arr);

此示例将一个字符串转换成字符数组。每个字符成为新数组中的一个元素。原始字符串保持不变。

$ node main.js
[ 'h', 'e', 'l', 'l', 'o' ]

带映射函数的 Array.from()

Array.from() 可以接受一个映射函数作为其第二个参数。

main.js
const nums = Array.from([1, 2, 3], x => x * 2);
console.log(nums);

在这里,我们在转换过程中将每个元素加倍。在将每个元素添加到新数组之前,将映射函数应用于该元素。这比在创建之后进行映射更有效。

$ node main.js
[ 2, 4, 6 ]

将 Set 转换为数组

Array.from() 可以将 Set 对象转换为数组。

main.js
const mySet = new Set([1, 2, 3, 3, 4]);
const uniqueArr = Array.from(mySet);
console.log(uniqueArr);

此示例演示了通过将 Set 转换为数组来删除重复项。生成的数组仅包含唯一值。重复的 3 被删除。

$ node main.js
[ 1, 2, 3, 4 ]

使用 NodeLists

Array.from() 常用 于将 NodeLists 转换为数组。

main.js
// In a browser environment:
// const divs = document.querySelectorAll('div');
// const divArray = Array.from(divs);

// For demonstration:
const fakeNodeList = { 0: 'div1', 1: 'div2', length: 2 };
const nodeArray = Array.from(fakeNodeList);
console.log(nodeArray);

这展示了如何将 DOM NodeLists 转换为数组,以便更容易地操作。然后可以使用 map 和 filter 等数组方法。该示例使用一个模拟的 NodeList 进行演示。

$ node main.js
[ 'div1', 'div2' ]

从具有 length 属性的对象创建数组

Array.from() 可以从具有 length 属性的对象创建数组。

main.js
const obj = { length: 5 };
const arr = Array.from(obj, (v, i) => i * 2);
console.log(arr);

在这里,我们仅使用一个具有 length 属性的对象来创建偶数数组。映射函数接收值和索引。索引用于生成值,因为源对象没有值。

$ node main.js
[ 0, 2, 4, 6, 8 ]

Array.from() vs 展开运算符

比较 Array.from() 和展开运算符。

main.js
const str = 'hello';
const arrFrom = Array.from(str);
const arrSpread = [...str];

console.log(arrFrom);
console.log(arrSpread);

这两种方法都将字符串转换为数组,但 Array.from() 适用于更多类型的对象。展开运算符要求对象是可迭代的,而 Array.from() 也适用于类似数组的对象。

$ node main.js
[ 'h', 'e', 'l', 'l', 'o' ]
[ 'h', 'e', 'l', 'l', 'o' ]

实际用例:生成序列

Array.from() 可以高效地生成数字序列。

main.js
const range = (start, stop, step) => 
    Array.from({ length: (stop - start) / step + 1 }, 
    (_, i) => start + (i * step));

console.log(range(0, 10, 2));

此示例从 start 到 stop 创建一个数字范围,并给出 step。长度根据参数计算。映射函数生成序列中的每个值。

$ node main.js
[ 0, 2, 4, 6, 8, 10 ]

来源

Array.from() - 语言参考

在本文中,我们演示了如何使用 Array.from() 方法从 JavaScript 中的各种来源创建数组。

作者

我叫 Jan Bodnar,是一个充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。