Array.from() 更适合大数据量场景,因其无参数长度限制、内存更可控;展开运算符适用于小数组或简单展开,但大数组易触发 RangeError 和高内存峰值。

展开运算符([...arr])和 Array.from() 都能创建新数组,但性能表现因场景而异——没有绝对“更快”,关键看数据类型、大小和操作意图。
小数组(
现代引擎(V8、SpiderMonkey)对这两种方式都做了高度优化。在日常开发中,比如复制表单字段、处理短列表,性能差异可忽略不计。
- 展开运算符写法更简洁:
const copy = [...original]; -
Array.from()稍多一次函数调用开销,但实际测量中通常差不到 0.1ms
字符串转字符数组:Array.from 更可靠
面对 emoji 或中文等含代理对(surrogate pairs)的字符,Array.from(str) 按 Unicode 码点拆分,结果准确;[...str] 虽然多数情况下也正确,但在极旧环境或某些边界字符上可能出错(如部分四字节 emoji 在早期 Node.js 中被误拆)。
- ✅ 推荐统一用
Array.from(str)处理用户输入、国际化文本 - ❌ 不要依赖
[...str]做字符计数或光标定位类逻辑
类数组对象(如 NodeList、arguments):Array.from 是唯一安全选择
展开运算符要求对象必须是可迭代的(有 Symbol.iterator),而原生 NodeList 在部分旧浏览器中并不具备该接口。
立即学习“Java免费学习笔记(深入)”;
- ✅
Array.from(document.querySelectorAll('div'))兼容 IE11+ 及所有现代浏览器 - ❌
[...document.querySelectorAll('div')]在 IE 和部分 Android WebView 中直接报错 - 若需映射转换(如提取元素 id),
Array.from(nodeList, el => el.id)一行搞定,展开运算符需额外.map()
大数组(>5 万项):Array.from 内存更可控
展开运算符本质是“把数组展开成参数传给构造函数”,当数组过大时,会触发引擎的参数长度限制(如 V8 的 ~65536 参数上限),导致 RangeError;Array.from() 无此限制,且内部采用循环而非参数展开,更适合批量处理。
- 大数据量去重、日志解析、CSV 行转数组等场景,优先选
Array.from() - 若用展开运算符合并多个大数组(如
[...a, ...b, ...c]),内存峰值更高,易触发 GC
不复杂但容易忽略:选哪个,先看“它是不是可迭代对象”,再看“要不要边转边算”,最后看“数据会不会很大”。



















