【问题标题】:Array.prototype.sort.apply( someArray, args ) vs someArray.sort.apply( someArray, args )Array.prototype.sort.apply(someArray, args) 与 someArray.sort.apply(someArray, args)
【发布时间】:2015-08-22 13:37:34
【问题描述】:

sorted_copy 函数的以下两个实现之间是否存在实质性差异(注意:只有最后几行不同):

/* version 1 */

function sorted_copy ( array ) {
    var extra_args = Array.prototype.slice.call( arguments, 1 );
    var copy = array.slice();
    return Array.prototype.sort.apply( copy, extra_args );
}
/* version 2 */

function sorted_copy ( array ) {
    var extra_args = Array.prototype.slice.call( arguments, 1 );
    var copy = array.slice();
    return copy.sort.apply( copy, extra_args );
}

更一般地说,假设我们手头有一个变量someInstance1,它的值确实是SomeType2的一个实例,而argsArray 的一些合适的实例,那么什么时候有理由更喜欢以下其中一个?

SomeType.prototype.someMethod.apply( someInstance, args );

someInstance.someMethod.apply( someInstance, args );

同样,如果arg1, arg2, ... 是一些值序列,那么什么时候有理由选择以下其中一个?

SomeType.prototype.someMethod.bind( someInstance, arg1, arg2, ... );

someInstance.someMethod.bind( someInstance, arg1, arg2, ... );

1假设所有其他条件都相同,我认为SomeType.prototype.someMethod... 表单的一个可能好处是它们可以避免 创建一个变量只是为了获取它的someMethod。例如,在sorted_copy 的版本1 中,可以省略定义copy 变量(即函数体的第二行),而只需返回Array.prototype.sort.apply( array.slice(), extra_args )。上面关于someInstance 变量的存在应该被视为给定的规定只是为了考虑到这个问题的目的而考虑到SomeType.prototype.someMethod... 形式的这个小可能好处。

2 当然,someInstance.someMethod 方法是SomeType 的一个实例而继承的方法不用说,否则这个帖子的问题就变得无足轻重了。

【问题讨论】:

  • 当使用.apply().bind() 时,没有强烈的争论。对于您的.call() 示例,如果someInstance 实际上有someMethod,您只需执行someInstance.someMethod(arg1, arg2, ...);。根本不需要.call()
  • @squint:谢谢!我倾向于将applycallbind(有点自动)视为一个组,但在阅读您的评论时,我发现这个问题对call 没有多大意义。哦!我将编辑我的帖子以摆脱这种情况。
  • 你知道,ECMAScript 6 有rest parameters,所以你可以做function sorted_copy ( array, ...extra_args ) {,然后它有spread operator,所以return array.slice().sort(...extra_args)

标签: javascript prototype


【解决方案1】:

Array.prototype.sort.someArray.sort.(注意尾随的点)是完全一样的,所以没有区别。 Array.prototype.sort()someArray.sort() 不同,但这是另一个问题。

出于性能原因,使用Array.prototype 可能会更好,因为您可以将其缓存在您的命名空间中,请参见例如underscore sources.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    相关资源
    最近更新 更多