当前位置: 首页 > news >正文

Array.from()

Array.from() 是 JavaScript 中用于将类数组对象或可迭代对象转换为真正数组的静态方法,支持在转换过程中进行元素映射,是处理非标准数组数据结构的强大工具。

一、基本概念与语法

Array.from()ES6 引入的静态方法,用于从 类数组对象(如 argumentsNodeList)或 可迭代对象(如 StringSetMap)创建一个新的浅拷贝数组实例。其核心优势在于能处理那些"看起来像数组但不是数组"的数据结构。

语法

Array.from(arrayLike[, mapFn[, thisArg]])
参数类型是否必填说明
arrayLike 对象/可迭代对象 必填 要转换的类数组对象或可迭代对象
mapFn 函数 可选 对每个元素执行的映射函数(类似 map()
thisArg 任意类型 可选 执行 mapFn 时的 this

二、核心功能与使用场景

1. 转换类数组对象为数组

类数组对象 是指 拥有 length 属性并可通过数字索引访问元素 的对象,常见于:

  • 函数的 arguments 对象

    function sum() {const args = Array.from(arguments);return args.reduce((acc, curr) => acc + curr, 0);
    }
    console.log(sum(1, 2, 3)); // 6
    
  • DOM 操作返回的集合(如 NodeListHTMLCollection):

    const divs = document.querySelectorAll('div'); // NodeList
    const divArray = Array.from(divs); // 转换为真正的数组
    divArray.forEach(div => console.log(div)); // 现在可以使用数组方法
    

2. 转换可迭代对象为数组

可迭代对象 是指 实现了 [Symbol.iterator] 方法 的对象,包括:

  • 字符串

    const str = "hello";
    const charArray = Array.from(str);
    console.log(charArray); // ['h', 'e', 'l', 'l', 'o']
    
  • Set 和 Map

    const set = new Set(['a', 'b', 'c']);
    console.log(Array.from(set)); // ['a', 'b', 'c']const map = new Map([['a', 1], ['b', 2]]);
    console.log(Array.from(map)); // [['a', 1], ['b', 2]]
    console.log(Array.from(map.values())); // [1, 2]
    

3. 使用映射函数处理元素

Array.from()第二个参数 mapFn 允许在转换过程中对每个元素进行处理,避免了先转换再调用 map() 的额外开销

  • 基本映射

    const numbers = Array.from({ length: 5 }, (_, index) => index + 1);
    console.log(numbers); // [1, 2, 3, 4, 5]
    
  • 复杂转换

    const str = 'hello';
    const codeArray = Array.from(str, char => char.charCodeAt(0));
    console.log(codeArray); // [104, 101, 108, 108, 111]
    
  • 等同于 Array.from(obj).map(),但更高效

    Array.from([1, 2, 3], x => x * x); // [1, 4, 9]
    // 等同于
    Array.from([1, 2, 3]).map(x => x * x);
    

4. 处理稀疏数组

Array.from() 不会创建稀疏数组,缺失索引会填充为 undefined

const sparseArray = Array(3); // 创建稀疏数组
console.log(sparseArray); // [empty × 3]const denseArray = Array.from(sparseArray);
console.log(denseArray); // [undefined, undefined, undefined]

三、与传统方法的对比优势

1. 与 Array.prototype.slice.call() 对比

  • 旧方法

    const args = Array.prototype.slice.call(arguments);
    
  • Array.from() 优势

    • 语义更清晰:直接表明"从某物创建数组"的意图
    • 适用范围更广:支持类数组对象和可迭代对象
    • 代码更简洁:无需额外处理
    • 支持内置映射:无需额外调用 map()

2. 与 扩展运算符(...)对比

  • 扩展运算符

    const args = [...arguments];
    
  • Array.from() 优势

    • 支持非可迭代的类数组对象:扩展运算符要求对象必须有 Symbol.iterator 接口
    • 能在转换时进行映射:扩展运算符无法直接映射
    • 处理稀疏数组更可靠:扩展运算符可能产生意外结果

四、高级应用技巧

1. 生成特定长度的数组

// 生成 [0, 1, 2, 3, 4]
const sequence = Array.from({ length: 5 }, (_, i) => i);// 生成 [1, 2, 3, 4, 5]
const numbers = Array.from({ length: 5 }, (_, i) => i + 1);// 生成字母序列
const alphabet = Array.from({ length: 26 },(_, i) => String.fromCharCode(65 + i)
);
console.log(alphabet); // ['A', 'B', 'C', ..., 'Z']

2. 数组去重与合并

// 数组去重
const arr = [1, 2, 2, 3, 3];
const uniqueArr = Array.from(new Set(arr));
console.log(uniqueArr); // [1, 2, 3]// 合并多个数组并去重
function combine() {let arr = [].concat.apply([], arguments);return Array.from(new Set(arr));
}
const m = [1, 2, 2], n = [2, 3, 3];
console.log(combine(m, n)); // [1, 2, 3]

3. 填充默认值

// 创建长度为5的数组,所有元素为0
const defaultArr = Array.from({ length: 5 }, () => 0);
console.log(defaultArr); // [0, 0, 0, 0, 0]// 创建重复值的数组
const repeatArr = Array.from({ length: 3 }, () => 'jack');
console.log(repeatArr); // ['jack', 'jack', 'jack']

五、注意事项

  1. 不会创建稀疏数组Array.from() 总是返回一个密集数组,缺失索引会填充为 undefined

  2. Array.map() 的区别

    • Array.from(obj, mapFn)Array.from(obj).map(mapFn) 结果相同
    • Array.from() 不会创建中间数组,更高效
    • mapFn 仅接受两个参数(elementindex),不接受数组参数
  3. 兼容性:现代浏览器普遍支持,旧浏览器可使用 polyfill

  4. 浅拷贝特性:如果被转换对象包含对象引用,新数组包含的是对这些对象的引用(不是深拷贝)

Array.from() 是处理 JavaScript 中非标准数组数据结构的首选工具,它让代码更简洁、语义更清晰、功能更强大,特别适合处理 DOM 集合、函数参数、字符串转换等场景。

http://www.jsqmd.com/news/443459/

相关文章:

  • 2026电线电缆厂家五大推荐:实力铸就品质,华科中缆领衔行业新标杆 - 深度智识库
  • ‌响应时间优化:数据库索引调整秘籍
  • 新疆国旅来样定制旅游性价比怎样,推荐哪家? - 工业设备
  • 风机无人机巡检:当飞行器成为风力发电的“空中医生”
  • 实测不踩雷✨十大手动剃须刀品牌|男生理容修毛全适配 - 品牌测评鉴赏家
  • 总结马鞍山潮源汇3M旗舰店特色,看看它在当地是否值得选择 - 工业品网
  • 芯谷科技—78MXX系列三端固定电压稳压器
  • IT 工单系统与企业流程审批系统,看起来相似,实际上用途完全不同
  • BrowserStack负载测试中的渲染机制剖析
  • 2026年上海阿里云企业邮箱服务商推荐,安全稳定高效办公解决方案 - 品牌2026
  • 想做全国业务,哪些 GEO 优化服务商值得选? - 品牌推荐大师
  • MOSS-TTS:基于 CAT 架构的解耦式生产级语音生成模型;打破单细胞分析壁垒:Pan-Cancer scRNA-Seq 数据集构建跨癌种免疫图谱基准
  • GEO全链路服务的完整定义:从概念到落地 - 一搜百应
  • 2026大健康创业TOP5|热门方向+知名品牌 合作创业指南 - 品牌智鉴榜
  • 2026年环保设备厂家推荐排行榜:洒水车/洗车机/雾炮机/扫地机/降尘设备等源头工厂,专业实力与高效清洁解决方案深度解析 - 品牌企业推荐师(官方)
  • 2026年上海物流公司推荐榜单:智能仓储/冷链运输/大件托运/电商仓储等专业服务商实力解析与口碑之选 - 品牌企业推荐师(官方)
  • 变频/液压站/恒温油冷机品牌与厂家深度评测:节能高效与智能控制的优选方案 - 品牌推荐大师
  • 老王-银发经济与国产替代
  • 2026实测|手动剃须刀品牌排行榜,新手/敏感肌闭眼入不踩雷 - 品牌测评鉴赏家
  • 2026年京东e卡回收平台全方位盘点,老司机带你避坑 - 京回收小程序
  • emlog无法下载安装包,提示:安装失败、无法下载安装包
  • 老王-做异形件
  • es8日常维护
  • 2026年环卫车厂家实力推荐榜:环卫垃圾车/清扫车/扫地车/电动环卫车/压缩环卫车/洒水车,专业制造与高效清洁解决方案深度解析 - 品牌企业推荐师(官方)
  • 2026年成都靠谱婚姻律师推荐,沈辉律师市场口碑和性价比哪家好 - 工业品牌热点
  • 老王-缺钱时你在找谁的问题
  • 请问网站出现502怎么解决?
  • 2026中国电动工具行业洞察:从无刷锂电升级看SATA世达的体系化布局 - 博客万
  • 2026年 老旧小区加装电梯/老房加装电梯/别墅电梯厂家推荐排行榜,专业改造方案与安全舒适乘梯体验深度解析 - 品牌企业推荐师(官方)
  • 老王-上岸不是方法是先解决自己