You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript中Array.concat报错,Array.prototype.concat.call却正常?

为什么Array.concat()报错,而Array.prototype.concat()能正常运行?

1. Array构造函数本身没有concat静态方法

JavaScript中,concat是数组的实例方法,它被定义在Array.prototype原型对象上,而非Array构造函数自身的静态方法。所以直接调用Array.concat()时,JS引擎找不到这个方法,自然抛出TypeError: Array.concat is not a function的错误。

2. Array.prototype.concat是真正的concat方法本体

Array.prototype是所有数组实例共享的原型对象,concat方法就挂载在这里。当你直接调用Array.prototype.concat({}, 1, 2, 3)时:

  • 方法内部的this指向Array.prototype(它本身是一个空数组)
  • concat方法会将传入的所有参数依次拼接到调用它的数组(这里是空数组)后面,返回一个新数组
  • 最终得到的结果就是[{}, 1, 2, 3],和调用[].concat({}, 1, 2, 3)效果完全一致

补充:关于Array.prototype.concat.call()的用法

如果想用call改变this指向,让非数组对象也能借助concat完成拼接,示例如下:

// 将类数组对象作为基础拼接元素
const obj = {0: 'a', length: 1};
console.log(Array.prototype.concat.call(obj, 1, 2, 3));
// 输出: [ { '0': 'a', length: 1 }, 1, 2, 3 ]

这里call把this指向了obj,但因为obj不是数组,concat会先把它包装成一个数组元素,再拼接后续参数。

内容的提问来源于stack exchange,提问作者user14758149

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:20:35