// old way
if (type == 'foo' || type == 'bar') { ... }
// better
if (/^(foo|bar)$/.test(type)) { ... }
// object literal lookup
if (({ foo : 1, bar : 1 })[type]) { ... }
// old way
if (type == 'foo' || type == 'bar') { ... }
// better
if (/^(foo|bar)$/.test(type)) { ... }
// object literal lookup
if (({ foo : 1, bar : 1 })[type]) { ... }
我谦虚地不同意Rebecca Murphey,支持第一个选项的简单性。
我认为正则表达式非常快
机器码更快,但我们不使用它。
第三个选项很困惑
只有当你不熟悉这个技巧时才会感到困惑。(对于不习惯使用正则表达式比较两个字符串的人来说,第二个选项会更加困惑。)
编辑: 看起来当一个对象被明确地创建时,她是正确的,然而: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++; }
}
}
}
...
}
随着添加更多的备选字符串,第三个选项比其他两个选项更具扩展性,因为前两个选项是O(n),而第三个选项在平均情况下是O(1)。
如果我们想讨论哪个选项更美观/更易维护,那就是完全不同的对话了。
第一种情况应该使用 ===
来避免任何类型强制转换,但是根据您需要检查的替代方案数量,它可能会变成 O(N)
,但是根据您的代码,大多数JS引擎将能够进行简单的指针检查以进行比较。
在第二种情况下,您使用了RegExp,虽然RegExp非常快,但它们 tend to be slower for simple equality decisions than more direct equality comparisons. 您的简单字符串比较可能是现代JS引擎中的指针比较,但如果您使用正则表达式,则必须读取每个字符。
第三种情况更棘手-如果您确实有很多要检查的值,则可能会更快,特别是如果您缓存对象而不是重复创建它,因为它只是哈希查找-查找的确切性能取决于引擎。
我怀疑switch语句会打败对象文字情况。
出于好奇,我进行了测试(您可以在此处看到),最快的方法(至少在webkit nightly中)似乎是switch语句,其次是if,其次是对象,最后是regexp。
regexp
进行简单比较。 - David Titarenco我想在这里发表一下意见,提醒大家这是一本开源书籍,有很多人做出了贡献!讨论的部分确实是由社区成员提供的内容。如果您有改进该部分的建议,请在存储库上打开问题,或更好地,派生存储库并向我发送拉取请求 :)
话虽如此,我刚刚设置了一个 jsPerf 测试(http://jsperf.com/string-tests),至少在 Chrome 中,结果与书中所说的相反。我已经在书上开了一个问题,并将尝试在不久的将来解决这个问题。
最后,两件事:
为了简单和可读性,第一种方法总是胜出的。除非它在一个频繁执行的循环中使用,否则速度可能不会那么快,但是谁在意呢。
好的编译器应该能够优化掉这样的东西。
if (type == 'foo' || type == 'bar')
不是其中之一 :-) - T.J. Crowder