Skip to content

类数组的 [].slice.call 和 Array.prototype.slice.call

做一个不是很全面的测试,先说结论

  • 两者是同一个东西 比如 [].slice===Array.prototype.slice //true
  • 写法不一样,会对性能有多大的影响, 毕竟[]是要初始化一个对象
  • 如果担心第二条 完全一个保存在一个变量里面 let slicee = [].slice
  • 写法的不同基本不可能成为你的程序的性能瓶颈
  • github上面[].slice的写法数量远大于proto的写法
  • 怎么写的爽就怎么写,肯定是前者写的更快

简单测试

js
let o = {0: "node", 1: "ts", 2: "java", 3: "js", 4: "python", length: 5}

console.time()
for (let i = 0; i < 2; i++) {
    [].slice.call(o, 1)
}
console.timeEnd()

console.time()
for (let i = 0; i < 1000000; i++) {
    Array.prototype.slice.call(o, 1)
}
console.timeEnd()

在node环境和chrome的控制台,两个都不分伯仲;
另一个有意思的发现是单独执行平均值基本一致
两个在一起执行,谁在后面谁慢

资料

将近10年前的文章,可能现在V8 优化的更好,更没必要纠结了 有一个jsrf的文章被到处引用,可惜这个网站已经挂掉了,不知道里面写了什么 https://stackoverflow.com/questions/9006553/slice-or-array-prototype-slice