使用带或不带 [end] 参数的 slice()
Using slice() with or without [end] argument
使用带或不带最后一个参数的 slice() 方法是否有任何性能差异[end]?
示例:
var m = ['But', 'Will', 'It', 'Blend', 'Question'];
var r = m.slice(1,3);
或
var r = m.slice(2);
PS: 不是结果,只是性能问题。
如果你看一下实现 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;
.....................................
});
此函数在两种情况下都具有线性复杂度 (O(n)
),无论是仅指定一个参数还是指定两个参数。这是首先要考虑的。
第二件事是,如果只指定了一个参数,则第二个参数(切片的末尾)将按默认值 (#length
) 在后台计算。所以你可能会认为 #slice(4)
调用为 #slice(4, #length)
,这两个将是相同的。
接下来,当解释器接受这个调用并围绕它构建一个 AST 时,它必须处理两个值,而不是一个。所以它可能看起来像两倍的时间消耗。但是相对于整个脚本来说,这个开销是完全可以忽略不计的。
因此,两者在时间上没有显着差异。纯粹是代码可读性的问题。
使用带或不带最后一个参数的 slice() 方法是否有任何性能差异[end]?
示例:
var m = ['But', 'Will', 'It', 'Blend', 'Question'];
var r = m.slice(1,3);
或
var r = m.slice(2);
PS: 不是结果,只是性能问题。
如果你看一下实现 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;
.....................................
});
此函数在两种情况下都具有线性复杂度 (O(n)
),无论是仅指定一个参数还是指定两个参数。这是首先要考虑的。
第二件事是,如果只指定了一个参数,则第二个参数(切片的末尾)将按默认值 (#length
) 在后台计算。所以你可能会认为 #slice(4)
调用为 #slice(4, #length)
,这两个将是相同的。
接下来,当解释器接受这个调用并围绕它构建一个 AST 时,它必须处理两个值,而不是一个。所以它可能看起来像两倍的时间消耗。但是相对于整个脚本来说,这个开销是完全可以忽略不计的。
因此,两者在时间上没有显着差异。纯粹是代码可读性的问题。