js数组

弎。循环的性能与小优化

优化一:优化 for 循环

  • 当循环复杂度为 O(n) 时,减少每次迭代的工作量是最有效的方法。

  • 当复杂度大于 O(n) 时,建议着重减少迭代次数

a. 减少每次取length的次数

这样避免了每次执行循环都要先去找array.length

for (let i = 0; i < array.length; i++) {
    console.log(i) // 0 1 2
}

// 优化后
for (let i = 0, len = array.length; i < len; i++) {
    console.log(i) // 0 1 2
    // do sth...
}
复制代码

b. 倒序循环

for (let i = array.length; i > 0; i--) {
    console.log(i) // 3 2 1
}

// 优化后
for (let i = array.length - 1; i >= 0; i--) {
    console.log(i) // 2 1 0
}

// 优化后
for (let i = array.length; i--;) {
    console.log(i) // 2 1 0
    // do sth...
}
复制代码

优化二:不要使用 for-in 来遍历数组

在JavaScript提供的循环类型中,只有for-in循环比其他几种明显要慢。

由于每次迭代操作会同时搜索实例或原型属性,for-in循环的每次迭代都会产生更多开销,所以比其他循环类型要慢。

因此,除非你明确需要迭代一个属性数量未知的对象,否则应避免使用for-in循环。

优化三:慎用基于函数的迭代

例如:forEach

基于函数的迭代提供了一个更为便利的迭代方法,但它仍然比基于循环的迭代要慢一些对每个数组调用外部方法所带来的开销是速度慢的主要原因。在所有情况下,基于循环的迭代比基于函数的迭代快8倍,因此在运行速度要求严格时,基于函数的迭代不是更好的选择。

优化四:尽量使用 switch-case 条件语句

除非在非真既假的判断中,其余条件判断时多用 switch-case 语句,少用 if/else-if/else 语句。原因如下:

  • 支持关联操作,即不写 break 语句

  • 本质是汇编时生成的跳转表来指示 case 的地址,所以每一个 case 的执行时间基本是相同的,执行效率不会受先后顺序的影响

  • 代码更清晰,可读性和可维护性要高很多

优化五:查找表

当有大量离散数据的时候,使用查找表比使用if-else和switch-case快得多。

// 将返回值集合存入数组
const results = [result0, result1, result2, result3, result4]

// 返回结果
return results[value]
复制代码

肆。课外题

箭头函数的输出

var func1 = x => x
func1(2) // 2
var func2 = x => {x}
func2(2) // undefined
var func3 = x => ({x})
func3() // {x: undefined}
func3(2) // {x: 2}