[] .slice.call(this)vs array.prototype.call(this)

时间:2014-12-05 01:05:45

标签: javascript

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

[].slice.call(this) vs Array.prototype.slice.call(this);

他们似乎也这样做,有人可以解释不同的,我应该坚持哪一个?

干杯

4 个答案:

答案 0 :(得分:2)

它们几乎相同。让我们分析一下:

[].slice.call(data)

它做什么?

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

现在,第二个:

Array.prototype.slice.call(data)

这一个:

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

<强>结论

[].sliceArray.prototype.slice都会返回一个slice函数,你可以调用某个数组,然而这个数组不作为参数传递,而是作为参数传递context(使用函数对象的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

答案 1 :(得分:1)

绝对坚持后者,因为第一个是隐式数组结构,与:

相同

new Array().slice.call(this)

它构建了一个新的数组,之后需要进行垃圾回收,因为你不使用它。虽然两个语句都“有效”,但上面提到了很多额外的工作,首先构建一个新实例,然后查看实例本身是否具有slice属性,因为这是{{1}遍历链,并在prototype然后slice上找到Array.prototype。然后用你的其他数组作为作用域来调用它,所以基本上使用你的另一个渲染你创建的实例是无用的。

这就是为什么call正确的方式来访问Array.prototype.slice.call(myarr)方法。

答案 2 :(得分:1)

我认为Array实际上并不创建对象,而[]是Array的实例。

答案 3 :(得分:1)

Array.prototype.slice.call()似乎稍微高效,但这是有道理的,因为它会在运行时更快地查找&#34;这种方法。我认为[].slice.call()是最好的选择。 Here's the jsperf of reference

让我们成为现实,在什么情况下,两者之间可以忽略不计的差异是网站表现不佳的主要原因?听起来像天堂,实际上。文字方法的较短语法非常棒。我宁愿为自己输入原型变体而花费半秒时间,而不是更加高效。

Array.prototype的棺材...... 有些人说它是不负责任的,因为你冒险改变它。但是......那是愚蠢的。图1: Array.prototype = function() { console.log('foo') }; Whoopsie ...... 这可能一直都在发生。严重的是,即使授予其合法性仍然完好无损,我需要更长时间才能输入与其性感的文字妹妹相比,这是非常可怕的。

真正问题的真正答案是功能完全相同。使用你在临终前仍然会欣赏的任何一个。