为什么我不能使用Array.join.call代替Array.prototype.join.call

时间:2012-05-26 14:36:06

标签: javascript

function test()
{
alert(Array.join.call(arguments,'/')) //alerts /
alert(Array.prototype.join.call(arguments,'/')) //alerts Js/JScript
alert(Array.join(arguments,'/')) //alerts Js/JScript
}
test('Js','JScript');

为什么会有这种差异?为什么需要先引用原型? 另外,为什么只有当连接只需要一个分隔符参数时,Array.join才会提供所需的结果。

2 个答案:

答案 0 :(得分:5)

Array.join是一个全局函数。使用调用时,作为第一个参数传递的是this对象在<{1>}函数体内,然后是join函数的参数。

join

js> Array.join.call(null, [1, 2], "/") "1/2" 适用于Array.prototype.join的实例。因此,它期望Array成为实际数组,这就是您的第二个示例有效的原因。您的第二个示例相当于调用thisArray.prototype.join对象为this,这正是arguments。有关说明,请参阅MDN

答案 1 :(得分:1)

这是必要的,因为Arguments数组isn't actually a real Array Object.。规范将其称为“类似数组”,但它不包含通常与JavaScript数组相关联的任何方法,例如join

因此,上面的代码正在做的是使用call直接调用Array方法,并传递Arguments对象作为方法的范围。

本质上它会导致解释器将Arguments数组视为一个真正的数组,以便可以在其上执行这些方法。