为什么第三种选择比正则表达更好?

Nic*_*ilt 5 javascript performance

我认为正则表达式非常快,第三种选择令人困惑.你怎么看?

http://jqfundamentals.com/book/ch09s12.html

// old way
if (type == 'foo' || type == 'bar') { ... }

// better
if (/^(foo|bar)$/.test(type)) { ... }

// object literal lookup 
if (({ foo : 1, bar : 1 })[type]) { ... }
Run Code Online (Sandbox Code Playgroud)

Nik*_*bak 6

我会谦卑地不同意Rebecca Murphey并投票支持简单,这是第一种选择.

我认为正则表达式非常快
机器代码甚至更快,但我们不使用它.

第三个选择令人
困惑如果你不熟悉这个技巧,那只会让人感到困惑.(对于那些不习惯看正则表达式比较两个字符串的人来说,第二个选项会更加混乱.)


Dav*_*nco 5

我只是做了一个基本的基准,我老实说不确定她是如何得到这些结果的...... http://jsbin.com/uzuxi4/2/edit

正则表达式似乎是最好的,但第一个是所有现代浏览器中最快的.最后一个是极其缓慢的.我理解三者之间的复杂性理论,但在实践中,似乎并不正确.

更不用说第一个也具有最佳可读性的事实,它似乎也是最快的.我甚至嵌套循环来利用文字表或常量的任何浏览器缓存(无济于事).


编辑: 看来,当一个对象被明确创建时,她确实是正确的,但是:http://jsbin.com/uzuxi4/4/edit

function __hash() {
  ...

  var type = 'bar';
  var testobj = { foo : 1, bar : 1 };
  var c = 0;
  for (i = 0; i < 1000; i++) {
    if (testobj[type]) {
      for (j = 0; j < 10000; j++) {
          if (testobj[type]) { c++; }
      }
    }
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

我们看到,一旦对象具有内部参考,寻道时间就会下降到大约500毫秒,这可能是平台.对象键查找对于较大的数据集可能是最佳的,但实际上我并不认为它是日常使用的可行选项.


Mic*_*eyn 2

  1. 第一个选项可能涉及两个字符串比较。
  2. 第二个选项每次都涉及解析。
  3. 第三个选项对字符串进行简单的哈希处理,然后进行哈希表查找,就需要完成的工作量而言,在这种情况下这是最有效的。

随着添加更多替代字符串,第三个选项的扩展性也比其他两个更好,因为在平均情况下,前两个选项的复杂度为 O(n),第三个选项的复杂度为 O(1)。

如果我们想讨论哪个选项更漂亮/更易于维护,那是一个完全独立的对话。