【问题标题】:Using slice() with or without [end] argument使用带有或不带有 [end] 参数的 slice()
【发布时间】:2015-11-07 15:52:48
【问题描述】:

使用带有或不带有最后一个参数 [end] 的 slice() 方法是否有任何性能差异?

例子:

var m = ['But', 'Will', 'It', 'Blend', 'Question'];
var r = m.slice(1,3);

var r = m.slice(2);

PS:不是结果,而是性能问题。

【问题讨论】:

  • 没有真正的区别,你可以在jsperf进行测试
  • @adeneo 可以。谢谢

标签: javascript slice


【解决方案1】:

如果你看一下https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/slice 的实现,你会发现如果第二个参数没有被发送,那么它使用数组长度,所以不,我认为它们是相同的。

Array.prototype.slice = function(begin, end) {
  // IE < 9 gets unhappy with an undefined end argument
  end = (typeof end !== 'undefined') ? end : this.length;
  .....................................
});

【讨论】:

  • 好吧,这可以解决它。谢谢,@biancamihai
  • 这就是你在 javascript 中编写 polyfill 的方式,而不是实际的实现。它在浏览器本机代码中的实际实现方式可能因浏览器而异,但无论如何可能不会有太大的性能差异。
【解决方案2】:

此函数在两种情况下都具有线性复杂度 (O(n)),无论是仅指定一个参数还是两个参数。这是首先要考虑的事情。

第二件事是,如果只指定一个参数,第二个(切片的结尾)将在默认值(#length)下计算。所以你可能会想到#slice(4)调用#slice(4, #length),这两个会是一样的。

接下来,当解释器接受这个调用并围绕它构建一个 AST 时,它必须处理两个值,而不是一个。因此,它可能看起来是耗时的两倍。但与整个脚本相比,这个开销完全可以忽略不计。

因此,两者之间的时间安排没有显着差异。纯粹是代码可读性的问题。

【讨论】:

  • 这就是我的意思!由于 O(n) 复杂性仍然存在,因此似乎缺少最后一个参数实际上在复杂性中变成了可以忽略不计的“常数计数”。谢谢!
猜你喜欢
  • 2020-11-17
  • 2012-07-02
  • 1970-01-01
  • 2012-09-02
  • 2016-07-24
  • 2018-05-25
  • 2015-08-04
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多