Javascript 为什么要使用Array.prototype.map.call而不是Array.map.call
我偶然发现了一些代码行,这家伙使用Javascript 为什么要使用Array.prototype.map.call而不是Array.map.call,javascript,Javascript,我偶然发现了一些代码行,这家伙使用Array.prototype.map.call而不是Array.map.call: function getLinks() { var links = document.querySelectorAll('h3.r a'); return Array.prototype.map.call(links, function(e) { return e.getAttribute('href'); }); } 为什么不直接调用
Array.prototype.map.call而不是Array.map.call
:
function getLinks() {
var links = document.querySelectorAll('h3.r a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href');
});
}
为什么不直接调用Array.map.call
?我在Firefox控制台上进行了检查,Array
和Array.prototype
都具有映射功能。有区别吗?因为Array.map.call
不起作用。Array.map
用于接受两个参数:数组和回调call
运行一个函数,将其此
设置为您提供的对象
因此,当您运行Array.prototype.map.call(somearray,function(){…})时代码>它实际上与调用somearray.map(function(){…})时相同代码>Array.map
只是一种实用方法,Javascript仅在Firefox中使用(不使用它的另一个原因)必须让生活更轻松。Array.map
功能不是跨浏览器的
编辑:他们不得不使用Array.prototype.map.call(链接,…)的原因代码>而不仅仅是links.map(…)
是指querySelectorAll
不返回普通数组,它返回一个没有map
方法的NodeList
。他们可能避免了array.map
,因为它在Chrome或IE中不存在。map
是指在数组实例上调用的。因此,Array.prototype.map
<代码>数组.map
在大多数浏览器中都不存在。这是因为文档.querySelectorAll
不返回数组
实例,而是节点列表
的实例(或者至少不保证在所有浏览器上都返回数组
)。
NodeList
具有索引元素,但不包括数组
原型中的所有方法
这就是为什么我们需要在返回对象的上下文中从Array
的原型中调用map
方法的原因
我假设您理解这一点:
var a = [], f = function() {};
表达方式:
a.map(f);
相当于:
Array.prototype.map.call(a, f);
另见:
好问题:
数组是用于创建数组的构造函数。
如果在浏览器控制台中键入Array,您将得到一个函数定义,类似于
函数数组(){[本机代码]}
而如果在浏览器控制台中键入Array.prototype,则会得到一个空数组,即[]
i、 e.数组对象。
考虑这个摘录
function a(){
console.log('hi');
function b(){console.log('b');}
function c(){console.log('c');}
return {b:b,c:c,d:this}
}
当您键入d=newa()时
那么d是一个对象,它有两个属性,即函数b和c,您可以调用
>d.b()//logs b
但不能调用
a.b()或a.c()
//因为函数b和c不是a的属性。
正如函数b和c在函数a中定义一样。类似地,函数映射是在函数数组中定义的。
因此您不能调用Array.map()
,但必须获取数组的对象并在其上调用映射函数
Array.prototype
为我们提供了一个数组对象
因此他们使用Array.prototype.map.call(a,func)
对不起,解释得太久了。希望它能带来好处。:)嗨,你错了。原因是文档。querySelectorAll
不返回数组
实例。这就是为什么我们需要一个黑客在返回对象的上下文中从数组的原型调用它。@TomaszGawel:呃,问题是Array.map.call
和Array.prototype.map.call
之间的区别,而不是Array.prototype.map.call
和直接调用.map
之间的区别。或者至少这就是我从中得到的。@TomaszGawel:不,我的意思是Array.map
。在Firefox上试试。阅读此答案。Bonus SpiderMonkey屏幕截图:(cf.)另一方面,如果您可以保证Array.map
在默认情况下可用,您还可以执行函数getLinks(){return[link.href for(document.querySelectorAll('h3.ra');}
:)应该注意,这是从CasperJS爬虫程序示例中获取的。因此,无需担心跨浏览器的兼容性。