我有两个函数实现,它获取数组的最后一个元素。
function first(array) {
var length = array ? array.length : 0;
return length ? array[length - 1] : undefined;
}
function second(array) {
return array ? array[array.length - 1] : undefined;
}
第二个函数使用完整数组比第一个快,但慢慢地用空。为什么以及如何解决它?
使用完整数组的基准:http://jsperf.com/lodash-f-last/
答案 0 :(得分:4)
如果你希望你的代码快速,你永远不应该读出界限:V8 去优化执行该操作的代码。
在你second
函数中你正是这样做的 - 你读出了界限。而是在阅读之前检查边界:
function xlast(array) {
return (array && array.length > 0) ? array[array.length - 1]
: undefined;
}
答案 1 :(得分:3)
对我而言,似乎第二函数使用完整数组更快,因为您不必像第一个函数那样执行var length = array ? array.length : 0;
为您节省额外的三元条件。
使用空数组但是,第二函数较慢,因为您被迫执行arr[-1]
(因为空数组仍然提供true if if)这是一个getter函数,在第一个函数中,条件是if (0)
,这是假的,你只需返回undefined。
关于你的第二个问题 - 如何解决它 - 我认为这样做会有效,因为它会为你节省getter功能:
function second(array) {
return array && array.length ? array[array.length - 1] : undefined;
}
答案 2 :(得分:2)
如果是空数组,则可能是数组查找的成本,因为您的算法在零长度时表现不同,请注意?
运算符的控制变量:
function first(array) {
var length = array ? array.length : 0;
return length ? array[length - 1] : undefined;
}
通过评估?:construct 的右侧为[] 返回undefined,因为0的计算结果为false。
另一方面,
function second(array) {
return array ? array[array.length - 1] : undefined;
}
从评估数组[-1] 返回[] 的undefined,因为[]的计算结果为true。
如果是完整阵列,第二个算法简单易行。