array.from() 可将类数组或可迭代对象转换为真数组,1. 它通过识别对象的 length 属性和索引或 symbol.iterator 接口实现转换;2. 常用于处理 nodelist、arguments 或自定义类数组对象;3. 支持第二个参数映射函数,实现转换时同步处理元素;4. 与 [...spread] 相比能处理不可迭代的类数组,与 slice.call 相比语法更清晰且支持映射;5. 可生成指定长度数组、转换 set/map、结合 thisarg 使用;6. 注意仅适用于类数组或可迭代对象,对普通对象返回空数组,且为浅拷贝,需警惕引用共享问题,同时不可与 array.of() 混淆,后者用于创建新数组而非转换结构。

Array.from()
map
filter
Array.from()
要用
Array.from()
length
obj[0]
obj[1]
Symbol.iterator
Array.from()
最常见的场景就是处理 DOM
NodeList
arguments
length
基本用法示例:
转换 NodeList
document.querySelectorAll()
NodeList
const divs = document.querySelectorAll('div'); // 这是一个NodeList
const divArray = Array.from(divs); // 现在divArray就是一个真数组了
// 可以在divArray上使用所有数组方法
divArray.forEach(div => console.log(div.textContent));转换 arguments
arguments
function sumAll() {
// arguments是一个类数组对象
const argsArray = Array.from(arguments);
return argsArray.reduce((acc, val) => acc + val, 0);
}
console.log(sumAll(1, 2, 3, 4)); // 输出 10转换自定义的类数组对象: 只要你的对象有
length
Array.from()
const myCollection = {
0: 'apple',
1: 'banana',
2: 'orange',
length: 3
};
const fruits = Array.from(myCollection); // ['apple', 'banana', 'orange']
console.log(fruits instanceof Array); // true结合映射函数进行转换和处理:
Array.from()
mapFn
map
const numbers = Array.from({ length: 5 }, (_, i) => i * 2);
// 生成 [0, 2, 4, 6, 8]
// 第一个参数是 { length: 5 },一个简单的类数组对象
// 第二个参数是映射函数,_ 表示当前元素(这里是 undefined),i 是索引
const stringLengths = Array.from('hello', char => char.charCodeAt(0));
// 将字符串(可迭代)转换为字符的ASCII码数组 [104, 101, 108, 108, 111]这问题问得好,因为这确实是 JavaScript 开发中一个很常见的痛点。我们之所以执着于把类数组对象变成“真”数组,最核心的原因就是方法缺失。你想想,当你拿到一个
NodeList
arguments
map
filter
reduce
forEach
NodeList
arguments
forEach
Array.prototype.forEach
sort
slice
splice
这就好像你买了一辆车,它看起来像车,开起来也像车,但它没有方向盘、没有刹车、没有油门,你只能看着它。类数组对象就是这样,它们有
length
Array.prototype
所以,转换为真数组,就是为了解锁这些原生数组方法,让数据处理变得更灵活、更符合直觉。一旦它们变成了真数组,你就可以用链式调用 (
.map(...).filter(...).reduce(...)
在
Array.from()
Array.from()
[].slice.call(arrayLikeObject)
Array.prototype.slice
slice
call
this
slice
const divs = document.querySelectorAll('div');
const divArrayOld = [].slice.call(divs);区别:
Array.from()
[].slice.call()
call
slice
Array.from()
slice.call
map
Array.from()
slice.call
slice.call
length
Array.from()
Set
map
展开运算符 (...
NodeList
Set
map
const divs = document.querySelectorAll('div');
const divArraySpread = [...divs];
const mySet = new Set([1, 2, 3]);
const setArray = [...mySet]; // [1, 2, 3]区别:
Array.from()
length
myCollection
Symbol.iterator
Array.from()
总结一下:
Array.from()
[].slice.call()
我个人在写新代码时,会优先考虑
Array.from()
Array.from()
进阶用法:
快速生成特定长度和内容的数组: 这个用法非常巧妙,你不需要一个实际的“类数组对象”,只需要一个带有
length
Array.from()
new Array(length).fill(value)
map
// 生成一个包含1到10数字的数组
const numbers = Array.from({ length: 10 }, (_, i) => i + 1);
console.log(numbers); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// 生成一个包含指定字符重复次数的数组
const repeatedChars = Array.from({ length: 5 }, () => 'X');
console.log(repeatedChars); // ['X', 'X', 'X', 'X', 'X']这里
_
Array.from
{ length: N }undefined
i
处理 Set
map
Set
map
Array.from()
Set
map
const uniqueIds = new Set([101, 105, 103, 101]); const idArray = Array.from(uniqueIds); // [101, 105, 103] const userMap = new Map([['id', 1], ['name', 'Alice']]); const mapEntries = Array.from(userMap); // [['id', 1], ['name', 'Alice']] const mapKeys = Array.from(userMap.keys()); // ['id', 'name'] const mapValues = Array.from(userMap.values()); // [1, 'Alice']
使用 thisArg
Array.from()
thisArg
this
const converter = {
prefix: 'item-',
convert(value, index) {
return this.prefix + value + '-' + index;
}
};
const data = [1, 2, 3];
const convertedData = Array.from(data, converter.convert, converter);
console.log(convertedData); // ["item-1-0", "item-2-1", "item-3-2"]
// 如果没有第三个参数 converter,converter.convert 内部的 this 会是 undefined常见误区:
不是所有对象都能被转换:
Array.from()
length
Symbol.iterator
length
Array.from()
const plainObject = { a: 1, b: 2 };
const result = Array.from(plainObject);
console.log(result); // [] (因为 plainObject 既不是类数组也不是可迭代对象)浅拷贝的陷阱: 和许多其他数组创建方法一样,
Array.from()
const originalArray = [{ id: 1 }, { id: 2 }];
const newArray = Array.from(originalArray);
newArray[0].id = 99;
console.log(originalArray[0].id); // 99 (原始数组的元素也被修改了)如果需要深拷贝,你需要自己实现一个深拷贝逻辑,或者使用像
JSON.parse(JSON.stringify(obj))
undefined
Symbol
与 Array.of()
Array.from()
Array.of()
Array.of()
new Array()
// Array.from() 转换现有结构
Array.from('abc'); // ['a', 'b', 'c']
// Array.of() 根据参数创建新数组
Array.of(1, 2, 3); // [1, 2, 3]
Array.of(7); // [7] (而 new Array(7) 会创建一个长度为7的空数组)记住,
Array.from()
Array.of()
掌握这些进阶用法和避开常见误区,能让你更自如、更高效地运用
Array.from()
以上就是js 怎样用from将类数组对象转为真数组的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号