JavaScript: что более эффективно, ЕСЛИ блок или ПОПЫТКА/ВЫГОДА?

class AnsViewController: UIViewController {
   var theNum: Int

    override func viewDidLoad() {
        super.viewDidLoad()

        println(theNum)
    }

}

override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    let viewController = self.storyboard.instantiateViewControllerWithIdentifier("ansView") as AnsViewController
    viewController.num = theNum
    self.presentViewController(viewController, animated: true, completion: nil)
}
17
задан Geuis 17 February 2009 в 22:02
поделиться

5 ответов

Используйте если оператор. Я не знаю то, что издержки для ПОПЫТКИ/ВЫГОДЫ, но я подозреваю, что это намного больше, чем оценка булева выражения. Для удара ПОПЫТКИ/ВЫГОДЫ, Вы будете иметь к: выполните оператор, генерируйте ошибку [с теми связанными издержками], зарегистрируйте ошибку (по-видимому), сделал stacktrace (по-видимому), и попятился в код. Кроме того, если необходимо отладить код около тех строк, реальная ошибка могла бы быть запутана с тем, что Вы - ПОПЫТКА/ЛОВЛЯ.

, Кроме того, это - неправильное употребление ПОПЫТКИ/ВЫГОДЫ и может сделать Ваш код этим намного тяжелее для чтения. Предположим, что Вы делаете это для дольше или более запутываемые случаи? Где Ваша выгода могла бы закончиться?

Это упоминается как Обработка исключений

РЕДАКТИРОВАНИЕ: Как прокомментировано ниже, Вы только получаете удар производительности во время выполнения при фактическом порождении исключения.

17
ответ дан 30 November 2019 в 06:20
поделиться

Исключения должны использоваться для исключительных обстоятельств (т.е. вещи, что Вы не ожидаете происходить обычно). Вы не должны, в целом, использовать исключения для ловли чего-то, на что можно протестировать с если оператор.

кроме того, от того, что я понимаю, исключения являются намного более дорогими чем если бы операторы.

19
ответ дан 30 November 2019 в 06:20
поделиться

Для обеспеченного примера, где Вы переносите попытку/выгоду вокруг блока кода, который должен всегда работать так или иначе (если, если что-то ужасное происходит), это не хорошая форма для использования попытки/выгоды. Аналогия для Вас: Вы всегда тестируете, "Лазурный?" в Вашем, если оператор, или был бы Вы переносить его в попытку/выгоду, которая инициирована только, когда небо, оказывается, оказывается Green.

Использование, Если метод оператора, если Вы имеете дело с пользователем, предоставленным входу или если возможности функции, не существующей, происходит намного выше из-за чего-то еще происходящего в коде.

Имеют в виду, что, если Вы не инициировали исключение, у Вас нет раскручивания или отслеживания в обратном порядке через код. В примере только выполнится выгода, если что-то будет неправильно (jQuery отсутствует или некоторая такая вещь), однако, если метод оператора имеет оценку, происходящую на КАЖДОМ ВЫЗОВЕ с той функцией - Вы не должны делать большего количества работы, чем Вы имеете к.

2
ответ дан 30 November 2019 в 06:20
поделиться

Я написал бы следующий код:

var startTime = (new Date()).getTime();
for (var i=0; i < 1000; ++i) intvar();
var endTime = (new Date()).getTime();
alert("Took " + ((endTime - startTime) / 1000.0) " seconds");

Затем я попробовал бы обе версии intvar и видел бы который выполнения более быстро. Я сделал бы это сам, но у меня нет макета страницы, который Вы делаете так, мой код не работал бы.

Некоторые стилистические комментарии - не кажется необходимым протестировать, это jQuery является функцией. Если это не, Ваша веб-страница, вероятно, испорчена таким образом, что, не работая эти intvar код не поможет Вам. Если бы Вы редко ожидаете, что исключения будут брошены, я использовал бы попытку/выгоду.

2
ответ дан 30 November 2019 в 06:20
поделиться

Другие ответы корректны, try/catch для исключительных обстоятельств и обработки ошибок. if условия для логики программы. "Который быстрее?" неправильный вопрос.

А хорошее эмпирическое правило, если Вы ничего не делаете за исключением, это - вероятно, не исключение!

Для выяснения, чтобы использовать давайте сломаем Ваш если условие.

  1. typeof jQuery == 'function' jQuery () функция, определяемая?
  2. typeof nav == 'object' военно-морская глобальная переменная содержит объект?
  3. typeof pageid != 'undefined' pageid определенная глобальная переменная?
  4. typeof document.getElementById('leftnav') == 'object' документ содержит leftnav элемент?

первым является ясно исключение. Вы не становится далеким без jQuery () функция.

вторым является также исключение. Вы не идете никуда без военно-морского объекта.

третьим является исключение. Вам нужен pageid, чтобы сделать что-либо.

четвертой является, вероятно, логика. "Только выполните этот код, если существует leftnav элемент". Трудно сказать, потому что остальная часть кода не ссылается на leftnav элемент! Только комментарии делают, красный флаг. Таким образом, это - вероятно, ошибка программирования.

, Таким образом, я, вероятно, сделал бы это (с извинениями, если я забиваю jQuery):

var intvar = setInterval(function() {
    // If there's no leftnav element, don't do anything.
    if( typeof document.getElementById('leftnav') != 'object') {
        return;
    }

    try {
        clearInterval(intvar);
        jQuery('#'+nav[pageid].t1+'>a')
            .replaceWith(jQuery('<span>'+jQuery('#'+nav[pageid].t1+'>a').text()+'</span>'));

        //set display classes for nav
        jQuery('#'+nav[pageid].t1)
            .addClass('selected')
            .find('#'+nav[pageid].t2)
            .addClass('subselect');     //topnav
        jQuery('#'+nav[pageid].t3)
            .addClass('selected')
            .find('#'+nav[pageid].t4)
            .addClass('subselect');     //leftnav
    }
    catch(err) {
        ...do something with the error...
    }
},100);

..., но я действительно исследовал бы, если leftnav проверка элемента применима.

Наконец, я не могу не прокомментировать, что эта "функция" работает с глобальными переменными. Необходимо вместо этого передавать nav и pageid в функцию для поддержания инкапсуляции и исправности.

12
ответ дан 30 November 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: