Javascript 有没有更快的方法来编写条件语句?

Javascript 有没有更快的方法来编写条件语句?,javascript,syntactic-sugar,Javascript,Syntactic Sugar,我有这样一句话: if(window.location.hash != '' && window.location.hash != '#all' && window.location.hash != '#') 我可以这样写吗?我只需要提到一次window.location.hash?您可以使用in运算符和对象文本: if (!(window.location.hash in {'':0, '#all':0, '#':0})) 这是通过测试对象的键来实现的(0

我有这样一句话:

 if(window.location.hash != '' && window.location.hash != '#all' && window.location.hash != '#')

我可以这样写吗?我只需要提到一次
window.location.hash

您可以使用in运算符和对象文本:

if (!(window.location.hash in {'':0, '#all':0, '#':0}))
这是通过测试对象的键来实现的(0只是填充键)


另外请注意,如果您正在处理
对象的原型,这可能会中断。您可以使用in运算符和对象文本:

if (!(window.location.hash in {'':0, '#all':0, '#':0}))
这是通过测试对象的键来实现的(0只是填充键)


另外请注意,如果您正在处理
对象的原型,这可能会中断。显而易见的方法是:

var h = window.location.hash;
if (h != '' && h != '#all' && h != '#')

显而易见的方法是:

var h = window.location.hash;
if (h != '' && h != '#all' && h != '#')

正则表达式?可读性不强,但足够简洁:

if (/^(|#|#all)$/.test(window.location.hash)) {
    // ...
}
这也适用于:

if (window.location.hash.match(/^(|#|#all)$/)) {
    // ...
}

。。。但根据肯的评论,它的效率较低。

正则表达式?可读性不强,但足够简洁:

if (/^(|#|#all)$/.test(window.location.hash)) {
    // ...
}
这也适用于:

if (window.location.hash.match(/^(|#|#all)$/)) {
    // ...
}

。。。但根据Ken的评论,它的效率较低。

对于较新的浏览器使用
indexOf
,并为您可以找到的较旧的浏览器提供一个实现


对较新的浏览器使用
indexOf
,并为您可以找到的较旧的浏览器提供一个实现


只是一个补充,因为除了比较好的各种不重复自己的方法外,没有人提到:

在浏览器中,
window
Global
物体,所以如果你没有,就把它剪掉 拥有另一个名为
当前范围中的“位置”
(不太可能)<代码>位置。散列就足够了


只是一个补充,因为除了比较好的各种不重复自己的方法外,没有人提到:

在浏览器中,
window
Global
物体,所以如果你没有,就把它剪掉 拥有另一个名为
当前范围中的“位置”
(不太可能)<代码>位置。散列就足够了


我认为最好检查长度,因为第一个字符总是一个散列

var h = location.hash;
if ( h.length > 1 && h != '#top' )

我认为最好检查长度,因为第一个字符总是一个散列

var h = location.hash;
if ( h.length > 1 && h != '#top' )

使用数组的解决方案会更整洁(不需要填充0),但是IE没有
索引
,所以我想这会更好,因为你真的需要
?难道
0
s不能实现这一点吗?快速建议在简单的“或”情况下使用
1
,因此我猜
0
会否定它吗?@Isaac 0并不重要,
in
只是检查键。因此它们也可能是
1
s,在这两种情况下?使用数组的解决方案会更整洁(不需要填充0),但是IE没有
索引,所以我想这会更好,因为你真的需要
?难道
0
s不能实现这一点吗?快速建议在简单的“或”情况下使用
1
,因此我猜
0
会否定它吗?@Isaac 0并不重要,
in
只是检查键。因此它们也可能是
1
s,无论哪种情况?为了完全准确,第二个示例应该使用
search
而不是
match
,并且两者都应该测试值==-1。String的
search
方法与RegExp的
test
方法相当,而其
match
方法与RegExp的
exec
方法相当
match
exec
速度较慢,但提供更多信息(或
null
不匹配),而
search
test
只需在第一个匹配开始的字符串中给出索引(或-1表示不匹配)。
RegExp.test
返回布尔值,而不是索引。不过,我同意你其余的评论。我的第二个示例效率稍低,但比您提出的备选方案更具可读性——我想简洁是问题的关键。为了完全准确,第二个示例应该使用
搜索
,而不是
匹配
,两者都应该测试值==-1。String的
search
方法与RegExp的
test
方法相当,而其
match
方法与RegExp的
exec
方法相当
match
exec
速度较慢,但提供更多信息(或
null
不匹配),而
search
test
只需在第一个匹配开始的字符串中给出索引(或-1表示不匹配)。
RegExp.test
返回布尔值,而不是索引。不过,我同意你其余的评论。我的第二个例子效率稍低,但比你提出的备选方案更具可读性——我想简洁是问题的关键。我倾向于以这种方式使用局部变量。这也使得调试更容易。我倾向于用这种方式使用局部变量。它也使调试更容易。