JavaScript中可用Array.prototype.slice.call将类数组转为真实数组,通过call隐式绑定this指向类数组;ES6+推荐更简洁安全的Array.from或扩展运算符。

JavaScript 中可以用 Array.prototype.call 配合 Array.prototype.slice(或 Array.from 更推荐)来将类数组对象转为真实数组,同时实现 this 绑定。但需注意:call 本身不直接“绑定并转换”,而是用于调用方法时指定 this 和参数;真正执行转换的是 slice 这类数组方法。
用 slice.call 转换类数组并隐式绑定 this
Array.prototype.slice 是通用方法,可被类数组对象借用。通过 call 把它“借给”类数组,并把类数组作为 this 传入,就能返回新数组:
-
Array.prototype.slice.call(arguments)—— 常见于函数内处理不定参数 -
Array.prototype.slice.call(document.querySelectorAll('div'))—— 将 NodeList 转数组以便使用map、filter等 - 此时
call的作用是把slice的this指向类数组,不是手动绑定某个自定义this,因为slice内部只读取this.length和索引属性
手动绑定 this 并转换的典型场景
如果想在转换过程中显式控制 this(比如让 slice 方法内部访问某个上下文),可先用 bind 或箭头函数封装,再调用。但注意:slice 本身不依赖外部 this,所以一般无需额外绑定。真正需要绑定 this 的是自定义转换逻辑,例如:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 写一个带状态的转换器:
const toArray = Array.prototype.slice.call.bind(Array.prototype.slice),之后toArray(arguments)可复用 - 若方法需访问外部对象属性,可包装:
function convert() { return Array.prototype.slice.call(this).map(x => x * this.multiplier); },再用convert.call({ multiplier: 2 }, arguments)
更现代、更简洁的替代方案
ES6+ 推荐用原生方法替代 call + slice,语义更清晰且无需考虑 this 绑定问题:
立即学习“Java免费学习笔记(深入)”;
-
Array.from(arrayLike)—— 直接转换,支持映射函数:Array.from(nodeList, el => el.textContent) -
[...arrayLike](扩展运算符)—— 要求类数组有迭代器(如NodeList在现代浏览器中已支持,但arguments在非严格模式下仍需Array.from) - 两者都不涉及
this绑定逻辑,更安全、易读
注意事项
类数组必须有 length 属性和数字键(如 0、1),否则 slice.call 可能返回空数组或出错。例如:
- ✅ 正确:
{ 0: 'a', 1: 'b', length: 2 } - ❌ 无效:
{ 0: 'a', 1: 'b', length: 5 }(会取undefined补足) - ❌ 失败:
{ a: 'x', b: 'y', length: 2 }(无数字索引,结果为[undefined, undefined])

















