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才会提供所需的结果。
答案 0 :(得分:5)
Array.join
是一个全局函数。使用调用时,作为第一个参数传递的是this
对象在<{1>}函数体内,然后是join
函数的参数。
join
js> Array.join.call(null, [1, 2], "/")
"1/2"
适用于Array.prototype.join
的实例。因此,它期望Array
成为实际数组,这就是您的第二个示例有效的原因。您的第二个示例相当于调用this
,Array.prototype.join
对象为this
,这正是arguments
。有关说明,请参阅MDN。
答案 1 :(得分:1)
这是必要的,因为Arguments数组isn't actually a real Array Object.。规范将其称为“类似数组”,但它不包含通常与JavaScript数组相关联的任何方法,例如join
。
因此,上面的代码正在做的是使用call
直接调用Array方法,并传递Arguments对象作为方法的范围。
本质上它会导致解释器将Arguments数组视为一个真正的数组,以便可以在其上执行这些方法。