繁体   English   中英

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

[英]Why can't I use Array.join.call in place of Array.prototype.join.call

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');

为什么会有这种差异? 为什么需要首先引用原型? 同样为什么即使join只需要一个分隔符参数,为什么Array.join也会给出所需的结果。

Array.join是全局函数。 当使用电话,你传递的第一个参数是什么this对象的体内 join的功能,那么对于参数join功能。

js> Array.join.call(null, [1, 2], "/")   
"1/2"

Array.prototype.join适用于Array实例。 因此,它希望this是实际的数组,这就是第二个示例起作用的原因。 您的第二个示例相当于调用Array.prototype.join ,并且this对象为arguments ,而this对象正是arguments.join("/") 有关详细信息,请参见MDN

这是必需的,因为Arguments数组实际上不是真正的Array Object。 该规范将其称为“类似数组”,但不包含通常与JavaScript数组相关联的任何方法,例如join

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

本质上,它使解释器将Arguments数组视为真实的Array,以便可以在其上执行那些方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM