这个JavaScript中的"if"语句如何缩短代码?

8
有没有一种使用JavaScript或jQuery更简短的方式来编写以下内容?
if (this.id==="a" || this.id==="b" || this.id==="c" || this.id==="d")

5
这是一个比较下面各种建议性能的网页:http://jsperf.com/set-memberbship。 - Jason LeBrun
@Jason LeBrun,我对这个漂亮的演示给出一个+1 -- 但通常情况下,清晰度优先。我把我的CPU速度慢归咎于FF发布的缓慢。;-) - user166390
5个回答

6

这个怎么样?

if ( this.id in { "a":1, "b":1, "c":1, "d":1 } ) {
  ...
}

... or this?

if("abcd".indexOf(this.id) > -1) {
   ...
}


+1 不过我不太会使用 1 作为虚拟值。 - ClosureCowboy
@ClosureCowboy:谢谢你的提示...我还添加了另一个例子,尽管在我看来它真的不太可读。 :) - limc
我不会把所有字母组合成一个单词。如果变量超过1个字母,这种方法将无法使用,虽然这样写很好看。 - Hussein
我正在写出数组。我真傻。 - Jason LeBrun
@Alex:你说得对,我划掉它了... @Jason:哈哈...感谢你向我抛出数组括号,我给你点赞。 :) - limc

5
if ( ['a','b','c','d'].indexOf( this.id ) >= 0 ) { ... }

或者

if ( this.id in {'a':0,'b':0,'c':0,'d':0} ) { ... }

2
如果this.id'a',第一个例子就不会知道它。 - ClosureCowboy
你的@limc的答案(d in o)都是类似的,并且是编写它最快的方法。感谢您提供的性能链接。 - Hussein
1
@alex:如果你需要广泛的浏览器支持,那么你可能需要使用“in”版本,因为“indexOf”没有那么多的跨浏览器支持。 - user113716
3
实际上,你可以通过在对象的属性名称周围去掉引号来缩短 in 版本的长度。只要 ID 是有效的 JavaScript 标识符,你就不需要它们了。 - user113716

2

一种可能性是使用switch语句。

switch(this.id){case"a":case"b":case"c":case"d":
    //do something
}

这也可以,但我们最终会像我的例子一样重复4次单词“case”,以及重复4次单词“this.id”。 - Hussein
@alex:是的,它确实更短一些,所以我想提出来。:o) - user113716

1
您可以尝试以下代码。特别是当您有四个以上的测试值时。
if (/^[abcdef]$/.test(this.id)) {
    ...
}

1
如果变量不止一个字母怎么办? - Hussein
if(/^(val1|val2|val3)$/.test(this.id)) { ... } - Jason LeBrun
更新了测试脚本,包括这两个想法。 - Jason LeBrun

0

内联匿名哈希(d in o)的性能在最初编写的测试中被误传,因为哈希在测试中没有内联。

奇怪的是,在Firefox 4中,与预定义哈希情况相比,真正的内联哈希情况要慢得多,但在Chrome 12中要快50%。

但更重要的一点是,d in o错过了哈希的重点——你不必迭代查找东西。

两行代码,但仍然非常简短,而且迄今为止最快

var o = {a:1,b:1,c:1,d:1};
if(o[this.id]){...}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接