只是想知道以下js脚本有什么不同。
[].slice.call(this) vs Array.prototype.slice.call(this);
他们似乎也这样做,有人可以解释不同的,我应该坚持哪一个?
干杯
答案 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
作为其上下文调用此方法。<强>结论强>
[].slice
和Array.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 ...... 这可能一直都在发生。严重的是,即使授予其合法性仍然完好无损,我需要更长时间才能输入与其性感的文字妹妹相比,这是非常可怕的。
真正问题的真正答案是功能完全相同。使用你在临终前仍然会欣赏的任何一个。