Ответ 1
Отвечая в общих чертах:
- Да обычно.
- Подробнее здесь
- Да, поскольку у каждого свой механизм обработки JS, однако при выполнении теста на указанном ниже сайте коммутатор всегда выполнял операции if, elseif на большом количестве итераций.
Ребята У меня есть пара вопросов:
switch
и if...else
?switch
и if...else
на разные браузеры? (FireFox, IE, Chrome, Opera, Safari)Причина для запроса этого вопроса заключается в том, что я получаю лучшую производительность в выражении switch
с примерно 1000-секундными случаями в Firefox.
Edited К сожалению, это не мой код, Javascript создается сервером из компилируемой библиотеки, и у меня нет доступа к этому коду. Метод, создающий javascript, называется
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
note arrayofvalues
- список, разделенный запятой.
что он производит,
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
Примечание: где [name]
= имя, переданное в функцию serveride
Теперь я изменил вывод функции, которую нужно вставить в TextArea, написал некоторый код JavaScript для анализа этой функции и преобразовал ее в набор операторов case
.
Наконец, я запускаю функцию, и она работает нормально, но производительность отличается в IE и Firefox.
Отвечая в общих чертах:
Иногда лучше не использовать ни того, ни другого. Например, в ситуации "отправки" Javascript позволяет вам делать что-то совершенно по-другому:
function dispatch(funCode) {
var map = {
'explode': function() {
prepExplosive();
if (flammable()) issueWarning();
doExplode();
},
'hibernate': function() {
if (status() == 'sleeping') return;
// ... I can't keep making this stuff up
},
// ...
};
var thisFun = map[funCode];
if (thisFun) thisFun();
}
Настройка многопоточного ветвления путем создания объекта имеет много преимуществ. Вы можете добавлять и удалять функциональные возможности динамически. Вы можете создать таблицу отправки из данных. Вы можете изучить его программно. Вы можете создавать обработчики с помощью других функций.
Там добавлены накладные расходы на вызов функции, чтобы получить эквивалент "case", но преимущество (когда есть много случаев) поиска хэша для поиска функции для определенного ключа.
Разница в производительности между switch
и if...else if...else
мала, они в основном выполняют ту же работу. Одна разница между ними, которая может иметь значение, заключается в том, что выражение для теста оценивается только один раз в switch
, пока оно оценивается для каждого if
. Если стоить оценить выражение, делать это один раз, конечно, быстрее, чем делать это сто раз.
Разница в реализации этих команд (и всего script в общем) немного отличается между браузерами. Общепринято видеть довольно большие различия в производительности для одного и того же кода в разных браузерах.
Как вы вряд ли сможете протестировать весь код во всех браузерах, вы должны пойти на код, который лучше всего подходит для того, что вы делаете, и попытаться сократить объем выполненной работы, а не оптимизировать, как это сделать.
В принципе, используйте все, что делает код наиболее читаемым. Есть определенные места, где одна или другие конструкции делают для более чистого, читаемого и более удобного для обслуживания. Это гораздо важнее, что, возможно, сэкономит несколько наносекунд в коде JavaScript.
Кроме синтаксиса, коммутатор может быть реализован с использованием дерева, которое делает его O(log n)
, тогда как if/else должен быть реализован с процедурным методом O(n)
. Чаще всего они обрабатываются процедурно, и единственная разница - это синтаксис, и, кроме того, это действительно имеет значение - если вы не статически вводите 10k случаев if/else в любом случае?
Есть ли разница в исходном состоянии в Javascript между оператором switch и if... else if.... else?
Я так не думаю, switch
полезно/коротко, если вы хотите предотвратить несколько условий if-else
.
Является ли поведение переключателя и если... else if... else different браузеры? (FireFox, IE, Chrome, Opera, Сафари)
Поведение одинаково во всех браузерах:)
Точечный ответ предполагает использование объектного литерала в качестве альтернативы switch
или if
/else
. Мне тоже нравится этот подход, но код в ответе создает новый объект map
каждый раз, когда вызывается функция dispatch
:
function dispatch(funCode) {
var map = {
'explode': function() {
prepExplosive();
if (flammable()) issueWarning();
doExplode();
},
'hibernate': function() {
if (status() == 'sleeping') return;
// ... I can't keep making this stuff up
},
// ...
};
var thisFun = map[funCode];
if (thisFun) thisFun();
}
Если map
содержит большое количество записей, это может создать значительные накладные расходы. Лучше всего настроить карту действий только один раз, а затем использовать уже созданную карту каждый раз, например:
var actions = {
'explode': function() {
prepExplosive();
if( flammable() ) issueWarning();
doExplode();
},
'hibernate': function() {
if( status() == 'sleeping' ) return;
// ... I can't keep making this stuff up
},
// ...
};
function dispatch( name ) {
var action = actions[name];
if( action ) action();
}
Получается, что if-else, если обычно быстрее, чем switch