Да, есть разница. Принимая во внимание ваш пример,
var a = 0,
b = 1;
Теперь давайте посмотрим на оператор switch
:
switch (a || b) {
Когда выполняется этот оператор switch, вычисляется выражение a || b
. ||
- оператор короткого замыкания, он вернёт значение левого операнда, если оно «правдиво», иначе вернет значение правого операнда. В этом случае a = 0
, поэтому будет возвращено b
(1
). Теперь посмотрим на утверждение case
:
case true:
При оценке операторов case
приведение типов не выполняется ни для одного из значений, и предполагается строгое равенство. В нашем примере это то же самое, что написать 1 === true
, поэтому код, следующий за оператором case
, никогда не запускается. Итак, давайте посмотрим на оператор if
:
if (a || b) {
Для оператора if
условное выражение a || b
оценивается , а затем результат преобразуется в логическое значение . Внутренне это выглядит как ToBoolean(a || b)
. Поскольку a || b
оценивается как 1
, а приведение 1
к логическому значению равно true
, условие проходит, и блок выполняется.
Лучшим эквивалентом будет:
if ((a || b) === true) {
// do some stuff
}
else {
// do other stuff
}
Как уже указывалось , в ситуациях, когда существует много вариантов и типов, может быть полезным выражение switch
. Однако такая ситуация была бы редкостью.