... существует, по крайней мере, простой способ проверить, есть ли у него конкретный метод, отличный от простого проверки, возникает ли ошибка при вызове метода
Легче просить прощения, чем разрешение ", безусловно, является путинским, то, что вы ищете, может быть:
d={'foo':'bar', 'spam':'eggs'} if 'get' in dir(d): d.get('foo') # OUT: 'bar'
Да, вы также можете сделать:
switch (true) {
case (var1 === true && var2 === true) :
//do something
break;
case (var1 === false && var2 === false) :
//do something
break;
default:
}
Это всегда будет выполнять переключатель, в значительной степени похожий на if / else, но выглядит более чистым. Просто продолжайте проверять свои переменные в выражениях case.
Во-первых, JavaScript switch
JavaScript не быстрее, чем if/else
(а иногда и намного медленнее) .
Во-вторых, единственный способ использовать switch
с несколькими переменными состоит в том, чтобы объединить их в одно примитивное значение (строка, число и т. д.):
var stateA = "foo";
var stateB = "bar";
switch (stateA + "-" + stateB) {
case "foo-bar": ...
...
}
Но лично я предпочел бы видеть набор if
/ else
.
Редактирование: когда все значения являются целыми числами, появляется сообщение о том, что переключатель может выйти из if / else в Chrome. См. Комментарии.
Как насчет побитового оператора?
// Declare slider's state "enum"
var SliderOne = {
A: 1,
B: 2,
C: 4,
D: 8,
E: 16
};
var SliderTwo = {
A: 32,
B: 64,
C: 128,
D: 256,
E: 512
};
// Set state
var s1 = SliderOne.A,
s2 = SliderTwo.B;
// Switch state
switch (s1 | s2) {
case SliderOne.A | SliderTwo.A :
case SliderOne.A | SliderTwo.C :
// Logic when State #1 is A, and State #2 is either A or C
break;
case SliderOne.B | SliderTwo.C :
// Logic when State #1 is B, and State #2 is C
break;
case SliderOne.E | SliderTwo.E :
default:
// Logic when State #1 is E, and State #2 is E or
// none of above match
break;
}
Я, однако, согласен с другими, 25 случаев в логике коммутационного шкафа не слишком хороши, и, в отличие от строк, вы имеете дело с «перечислениями», которые выглядят более «элегантными». if-else может в некоторых случаях «выглядеть» лучше. Так или иначе.
var var1 = "something";
var var2 = "something_else";
switch(var1 + "|" + var2) {
case "something|something_else":
...
break;
case "something|...":
break;
case "...|...":
break;
}
Если у вас есть 5 возможностей для каждого из них, вы получите 25 случаев.
Если действие каждой комбинации статично, вы можете построить двумерный массив:
var data = [
[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25]
];
Числа в приведенном выше примере могут быть любыми, такими как строка, массив и т. д. Извлечение значение теперь однострочное (если ползунки имеют диапазон значений [0,5]:
var info = data[firstSliderValue][secondSliderValue];
Да, но не в обычном режиме. Вам нужно будет использовать переключатель как замыкание.
ex: -
function test(input1, input2) {
switch (true) {
case input1 > input2:
console.log(input1 + " is larger than " + input2);
break;
case input1 < input2:
console.log(input2 + " is larger than " + input1);
default:
console.log(input1 + " is equal to " + input2);
}
}
Я не верю, что коммутатор / случай выполняется быстрее, чем серия if / elseif. Они делают то же самое, но если / elseif вы можете проверить несколько переменных. Вы не можете использовать переключатель / регистр более чем на одном значении.
Вы можете дать каждой позиции на каждом слайдере другое двоичное значение от 1 до 1000000000, а затем работать с суммой.