Javascript Array.prototype.sort.apply(someArray,args)与someArray.sort.apply(someArray,args)的比较
以下两种实现的Javascript Array.prototype.sort.apply(someArray,args)与someArray.sort.apply(someArray,args)的比较,javascript,prototype,Javascript,Prototype,以下两种实现的sorted_copy函数之间是否存在实质性差异(注意:只有最后几行不同): /*第1版*/ 函数已排序\u拷贝(数组){ var extra_args=Array.prototype.slice.call(参数,1); var copy=array.slice(); 返回Array.prototype.sort.apply(复制,额外参数); } /*第2版*/ 函数已排序\u拷贝(数组){ var extra_args=Array.prototype.slice.call(参
sorted_copy
函数之间是否存在实质性差异(注意:只有最后几行不同):
/*第1版*/
函数已排序\u拷贝(数组){
var extra_args=Array.prototype.slice.call(参数,1);
var copy=array.slice();
返回Array.prototype.sort.apply(复制,额外参数);
}
/*第2版*/
函数已排序\u拷贝(数组){
var extra_args=Array.prototype.slice.call(参数,1);
var copy=array.slice();
返回copy.sort.apply(复制,额外参数);
}
更一般地说,假设我们有一个变量
someInstance
,其值实际上是SomeType
2的一个实例,并且args
是Array
的一个合适实例,那么什么时候有理由选择下面的一个
SomeType.prototype.someMethod.apply(someInstance,args);
someInstance.someMethod.apply(someInstance,args);
类似地,如果arg1
,arg2
。。。是一系列的值,什么时候有理由选择下面的一个或另一个
SomeType.prototype.someMethod.bind(someInstance,arg1,arg2,…);
绑定(someInstance,arg1,arg2,…);
1假设所有其他事情都是相同的,我假设
SomeType.prototype.someMethod…
表单的一个可能好处是,它们可以避免只为获取其someMethod
而创建变量的需要。例如,在sorted\u copy
的版本1中,可以不用定义copy
变量(即函数体的第二行),只返回Array.prototype.sort.apply(Array.slice(),extra\u args)
。上面的规定是,someInstance
变量的存在应被视为给定的,只是为了考虑SomeType.prototype.someMethod…
的这一小部分可能的好处
2当然,不用说方法
someInstance.someMethod
是它继承的,因为它是SomeType
的一个实例,否则这篇文章的问题就变得无关紧要了。Array.prototype.sort.
和someArray.sort.
(注意后面的点)是完全一样的,所以没有区别Array.prototype.sort()
和someArray.sort()
是不同的,但这是另一个问题
出于性能方面的考虑,最好使用
Array.prototype
,因为您可以将其缓存在命名空间中,请参见,例如,使用.apply()
或.bind()
时,两者之间没有明显的区别。对于您的.call()
示例,如果someInstance
实际具有someMethod
,您只需执行someInstance.someMethod(arg1,arg2,…)代码>。根本不需要.call()
。@斜视:谢谢!我倾向于将apply
、call
和bind
(有点自动)视为一个群体,但在阅读您的评论时,我发现这个问题对call
没有多大意义。哦!我将编辑我的帖子以消除这种情况。正如您所知,ECMAScript 6有,所以您可以执行函数排序的复制(数组,…额外参数){
,然后它有,所以返回数组.slice().sort(…额外参数)
。