首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[].slice.call(此)诉array.prototype.call(this)

[].slice.call(此)诉array.prototype.call(this)
EN

Stack Overflow用户
提问于 2014-12-05 01:05:44
回答 4查看 122关注 0票数 0

只是想知道下面的js脚本有什么不同。

代码语言:javascript
复制
[].slice.call(this) vs Array.prototype.slice.call(this);

他们似乎在做同样的事情,有人能解释一下不同的地方吗?我应该坚持哪一个?

干杯

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-05 01:19:27

它们几乎是一样的。让我们检查其中的每一个:

代码语言:javascript
复制
[].slice.call(data)

它能做什么?

  • [] --这将创建新的数组,与new Array()相同
  • slice -它从数组中检索方法slice
  • call(data) --它调用slice()方法,用data变量替换其当前上下文,即使用data作为其内部数组,而不是[]。这将返回转换为dataArray

现在,第二个问题:

代码语言:javascript
复制
Array.prototype.slice.call(data)

这个:

  • Array.prototype.slice -从Array.prototype检索方法slice;简而言之,它返回没有任何上下文的slice方法(内部数据)。
  • call(data) --与以前的变体一样,使用data作为上下文调用此方法。

结论

[].sliceArray.prototype.slice都会返回一个slice函数,您可以对某些数组调用该函数,而--然而,该数组不是作为参数传递,而是作为上下文传递(使用函数对象的call方法)。在JavaScript中,这些调用将完全相同:

代码语言:javascript
复制
// Calling as a method of 'Hello' string
'Hello'.indexOf('e') // returns 1

// Calling as unbound method
String.prototype.indexOf.call('Hello', 'e') // returns 1
String.prototype.indexOf.apply('Hello', ['e']) // returns 1

这些方法几乎是一样的。第一种更易读,但第二种更少使用内存,因为它没有创建临时的初始Array

票数 2
EN

Stack Overflow用户

发布于 2014-12-05 01:09:53

肯定坚持后一种方法,因为第一种是隐式数组构造,与以下相同:

new Array().slice.call(this)

它构建了一个新的数组,需要在之后进行垃圾收集,因为您不使用它。虽然这两个语句都“工作”,上面提到的语句做了很多额外的工作,首先构造一个新实例,然后查找实例本身是否有slice属性,因为这是假的,prototype链被遍历,sliceArray.prototype上找到,然后called。然后,使用其他数组作为作用域调用它,因此实际上通过使用另一个数组将创建的实例呈现为无用。

这就是为什么Array.prototype.slice.call(myarr)是访问slice方法的合适的方法的原因。

票数 1
EN

Stack Overflow用户

发布于 2014-12-05 01:10:12

我相信Array实际上并没有创建一个对象,因为[]是数组的一个实例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27307133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档