为何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
相关产品推荐
相关产品推荐

