Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么要使用Array.prototype.map.call而不是Array.map.call_Javascript - Fatal编程技术网

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爬虫程序示例中获取的。因此,无需担心跨浏览器的兼容性。