array.from可直接将字符串转为字符数组并支持映射,天然正确处理unicode字符,语义清晰且性能优于split()+map。

Array.from 可以直接将字符串转为字符数组,再结合映射逻辑生成新数组,无需先调用 split()。
字符串自动展开为字符数组
String 原生具有 iterator 接口,Array.from 会自动遍历每个字符,等价于 [...str],但更明确表达“从可迭代对象构造数组”的意图。
- Array.from('abc') → ['a', 'b', 'c']
- 不同于 Array.from('abc', x => x.toUpperCase()) → ['A', 'B', 'C'],映射函数在构造时同步执行
- 注意:空字符串 Array.from('') 返回 [],安全无异常
映射函数中访问索引与原始字符串
Array.from 的第二个参数是映射回调,签名是 (value, index, array) ⇒ newValue。其中 value 是当前字符,index 是位置,array 是最终结果数组(此时正在构建,通常不需使用)。
- Array.from('hello', (char, i) => `${i}:${char}`) → ['0:h', '1:e', '2:l', '3:l', '4:o']
- 若需原始字符串,建议提前声明 const str = 'hello',在回调中闭包引用,避免依赖 this 或额外上下文
处理 Unicode 字符(如 emoji、中文)
普通 for 循环或 charAt 可能误切代理对,而 Array.from 内部使用迭代器,天然支持完整 Unicode 字符。
- Array.from('??a') → ['??', 'a'](正确拆分组合 emoji)
- Array.from('你好') → ['你', '好'](正确处理多字节字符)
- 对比 '??a'.split('') → ['', '', '', '', 'a'](损坏的代理对)
替代 map + split 的常见写法
过去常写 'abc'.split('').map(x => x + '!'),现在可合并为一步,语义更清晰且性能略优(少一次中间数组创建)。
- 推荐:Array.from('abc', x => x + '!') → ['a!', 'b!', 'c!']
- 不推荐嵌套:Array.from(Array.from('abc').map(...)) —— 多余且低效
- 若还需过滤,建议分开:Array.from('abc').filter(...).map(...),保持职责单一
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











