只是想知道下面的js脚本有什么不同。
[].slice.call(this) vs Array.prototype.slice.call(this);他们似乎在做同样的事情,有人能解释一下不同的地方吗?我应该坚持哪一个?
干杯
发布于 2014-12-05 01:19:27
它们几乎是一样的。让我们检查其中的每一个:
[].slice.call(data)它能做什么?
[] --这将创建新的数组,与new Array()相同slice -它从数组中检索方法slicecall(data) --它调用slice()方法,用data变量替换其当前上下文,即使用data作为其内部数组,而不是[]。这将返回转换为data的Array。现在,第二个问题:
Array.prototype.slice.call(data)这个:
Array.prototype.slice -从Array.prototype检索方法slice;简而言之,它返回没有任何上下文的slice方法(内部数据)。call(data) --与以前的变体一样,使用data作为上下文调用此方法。结论
[].slice和Array.prototype.slice都会返回一个slice函数,您可以对某些数组调用该函数,而--然而,该数组不是作为参数传递,而是作为上下文传递(使用函数对象的call方法)。在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。
发布于 2014-12-05 01:09:53
肯定坚持后一种方法,因为第一种是隐式数组构造,与以下相同:
new Array().slice.call(this)
它构建了一个新的数组,需要在之后进行垃圾收集,因为您不使用它。虽然这两个语句都“工作”,上面提到的语句做了很多额外的工作,首先构造一个新实例,然后查找实例本身是否有slice属性,因为这是假的,prototype链被遍历,slice在Array.prototype上找到,然后called。然后,使用其他数组作为作用域调用它,因此实际上通过使用另一个数组将创建的实例呈现为无用。
这就是为什么Array.prototype.slice.call(myarr)是访问slice方法的合适的方法的原因。
发布于 2014-12-05 01:10:12
我相信Array实际上并没有创建一个对象,因为[]是数组的一个实例。
https://stackoverflow.com/questions/27307133
复制相似问题