早期前端中类数组对象需转真数组,常用array.prototype.slice.call()(兼容性最好),也可用array.prototype.concat.apply([],类数组),es6推荐array.from()(但不支持ie8/9)。

早期前端开发中,类数组对象(如 arguments、NodeList、HTMLCollection)不能直接调用数组方法,但借助 call 或 apply 借用 Array.prototype 上的方法,就能快速转成真数组。
用 Array.prototype.slice.call() 最常用
这是兼容性最好、最广为流传的方式,适用于所有类数组对象:
-
slice()不修改原对象,返回新数组,天然适合“转化”场景 -
call()把this指向类数组对象,让slice把它当数组遍历 - 例如:Array.prototype.slice.call(arguments) 可在函数内把参数转成数组
- 对 DOM 查询结果也有效:Array.prototype.slice.call(document.querySelectorAll('div'))
用 Array.prototype.concat.apply() 替代方案
原理是把类数组作为参数传给 concat,利用其“合并多个值并返回新数组”的特性:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
-
concat接收任意数量参数,apply将类数组“展开”为独立参数 - 写法:Array.prototype.concat.apply([],类数组)
- 注意第一个参数必须是空数组
[],否则会把类数组本身当作一个元素塞进去 - 性能略低于
slice.call,但语义更直观——“把类数组拼成一个数组”
为什么不用 Array.from()?
Array.from() 是 ES6 新增的标准化方法,简洁且语义清晰,但它在 IE 和早期移动端浏览器中不支持。在需要兼容 IE8/9 的项目中,call 和 apply 是唯一可靠选择。若项目已放弃旧浏览器,优先用 Array.from() 更安全、可读性更高。
小技巧:封装成工具函数提升复用性
避免每次重复写长串原型链,可封装一个简短的转换函数:
- const toArray = slice => Array.prototype.slice.call(slice);
- 或更严谨一点:const toArray = obj => Array.prototype.slice.call(obj, 0);(显式传
start=0避免误传参数) - 调用时:toArray(arguments)、toArray(document.getElementsByTagName('li'))
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










