Javascript, если /else или тройной оператор быстрее?

Какой метод быстрее или быстрее реагирует на javascript, if/else или тернарный оператор? Предпочтительно ли использовать одно или другое, и если да, то по каким причинам?

Ответ 1

Разница в скорости будет незначительной - используйте то, что вы считаете более читаемым. Другими словами, я очень сомневаюсь, что узкое место в вашем коде будет связано с использованием неправильной условной конструкции.

Ответ 2

Кажется, что никто не делал никакого фактического профилирования. Вот код, который я использовал:

test = function() {
    for (var i = 0; i < 10000000; i++) {
        var a = i < 100 ? 1 : 2;

        /*
        if(i < 100) {
            var a = 1;
        }else{
            var a = 2;
        }
        */
    }
}

test();

Использование блока if/else вместо тернарного оператора дает увеличение производительности 1,5 - 2x в Google Chrome v21 под OS X Snow Leopard.

В качестве одного из примеров, когда это очень важно, синтезирование звука в реальном времени становится все более распространенным с JavaScript. Этот тип разницы в производительности - большое дело, когда алгоритм работает 44100 раз в секунду.

Ответ 3

Я не думал, что тест @charlie robert был честным.

Здесь мой jsperf

результат:

  • строгое равное - это самый быстрый
  • строгий тернар на 33% медленнее
  • правдивый фальшив на 49% медленнее
  • тернарный правдивый фальшив на 55% медленнее
  • если else и trernary примерно одинаковы.

нормальный равный и нормальный троичный самый медленный.

strict равно:

var a = true, b;

if (a === true) {
  b = true;
} else {
  b = false
}
if (a === false) {
  b = true;
} else {
  b = false;
}

тернарный строгий равен

var a = true, b;

b = (a === true) ? true : false;

b = (a === false) ? true : false;

простое равенство

 var a = true, b;

    if (a == true) {
      b = true;
    } else {
      b = false;
    }

    if (a == false) {
      b = true;
    } else {
      b = false;
    }

простое трехмерное равенство

 var a = true, b;
    b = (a == true) ? true : false;

    b = (a == false) ? true : false;

правша/фальшивость

var a = true, b;
if (a) {
  b = true;
} else {
  b = false;
}

if (!a) {
  b = true;
} else {
  b = false;
}

тернарная правда/фальшивость

var a = true, b;
b = (a) ? true : false;
b = (!a) ? true : false;

Ответ 4

чтобы ответить charlie roberts выше, я бы добавил:

следующая ссылка дает некоторые острые ответы; результат для переключателей в Firefox наиболее поразителен: http://jsperf.com/if-else-vs-arrays-vs-switch-vs-ternary/39

Те, кто задает вопрос, почему кто-то будет исследовать оптимизацию в этой степени, будут полезны для исследования WebGL!

Ответ 5

Тернарный оператор - это только синтаксический сахар, а не усилитель производительности.

Ответ 6

Нет никакой разницы в скорости.

Некоторые предпочитают if/else для удобочитаемости. Лично я использую тернарный оператор всякий раз, когда логика достаточно тривиальна для понимания на одной строке.