# js数组

By [John](https://paragraph.com/@john-4) · 2021-11-09

---

弎。循环的性能与小优化
===========

优化一：优化 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}

---

*Originally published on [John](https://paragraph.com/@john-4/js)*
