【问题标题】:Most efficent way to code branches in Javascript用 Javascript 编写分支的最有效方法
【发布时间】:2018-06-01 01:42:56
【问题描述】:

假设我有一个 Javascript 数组,其中包含 0 到 5 之间的数字。每个数字实际上都是调用特定函数的指令。例如:

var array = [lots of data];

for(i=0; i<array.length; i++){
  if(i == 0){ function0(); };
  if(i == 1){ function1(); };
  if(i == 2){ function2(); };
  if(i == 3){ function3(); };
  if(i == 4){ function4(); };
  if(i == 5){ function5(); };
}

这似乎是一大堆branching 和不必要的检查。调用该函数的更注重性能的方式是什么?

我想过使用eval动态创建函数名,但没有更好的方法吗?

【问题讨论】:

    标签: javascript arrays performance


    【解决方案1】:

    将函数存储在数组中;

    var array = [function0, function1, ..., functionN];
    

    然后在每次迭代中调用函数:

    for (var i=0; i<array.length; i++) {
      array[i]();
    }
    

    【讨论】:

    • 太棒了,谢谢我认为答案是最简单最易读的方法!我知道有一个明显的简单方法我只是忽略了
    【解决方案2】:

    使用Object 作为映射,或使用switch 语句。前者演示如下。

    const functionMap = {
        0: function0,
        1: function1,
        2: function2
    };
    
    array.foreach(i => functionMap[i]());
    

    或者,如果您可以根据i 知道函数的名称,您可以从父范围调用它,例如

    window[`function${i}`]()
    

    但是,严格来说,在if 语句中手动编码(或使用switch)可能是最高效的。我怀疑它们之间会存在显着的性能差异。

    【讨论】:

    • .foreach() 在这里比 .map() 更合适
    • 您发布的 2 个选项是很好的例子,我忽略了最简单的事情!我查看了 switch 在后端是如何工作的,它类似于 if-than,但是 functionMap 制作了一种字典哈希表来比较 id 和键,使其速度显着加快。但是,在阅读完所有答案后,我认为最快的方法是将函数存储在数组中并访问索引。
    【解决方案3】:

    函数可以作为字符串调用,所以window['function' + i]() 可以工作,并调用一个函数。这可能是非常动态的。

    var array = [0, 1, 2];
    
    function function0() { console.log('Function 0') }
    function function1() { console.log('Function 1') }
    function function2() { console.log('Function 2') }
    
    for (i = 0; i < array.length; i++) {
      if (typeof window['function' + i] == 'function') {
        window['function' + i]()
      }
    }

    【讨论】:

    • 这样做通常不是一个好习惯,通过字符串键访问全局变量很难跟踪/调试,每个函数的用法也不是那么明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多