Есть ли более быстрый способ написания условных операторов? - PullRequest
1 голос
/ 16 ноября 2010

У меня есть такое утверждение:

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

Могу ли я написать так, чтобы я упомянул window.location.hash только один раз?

Ответы [ 6 ]

7 голосов
/ 16 ноября 2010

очевидный способ сделать это:

var h = window.location.hash;
if (h != '' && h != '#all' && h != '#')
6 голосов
/ 16 ноября 2010

вы можете использовать оператор in и литерал объекта:

if (!(window.location.hash in {'':0, '#all':0, '#':0}))

это работает путем проверки ключей объекта (0 просто заполнитель).

Также обратите внимание, что это может сломаться, если вы возитесь с прототипом object

3 голосов
/ 16 ноября 2010

Регулярное выражение? Не так читабельно, но достаточно кратко:

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

Это также работает:

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

... но это менее эффективно, согласно комментарию Кена.

1 голос
/ 16 ноября 2010

Я думаю, что хорошо проверить длину, поскольку первый символ всегда является хешем.

var h = location.hash;
if ( h.length > 1 && h != '#top' )
1 голос
/ 16 ноября 2010

Просто добавление, потому что, помимо довольно хорошего разнообразия , не повторяются подходы, никто не упомянул, что:

В браузерах window является Global объектомпоэтому отключите его, если у вас нет другого свойства с именем "location" в текущей области (маловероятно).location.hash достаточно

1 голос
/ 16 ноября 2010

Используйте indexOf для новых браузеров и предоставьте реализацию для старых браузеров, которую вы можете найти здесь .

// return value of -1 indicates hash wasn't found
["", "#all", "#"].indexOf(window.location.hash)
...