Velocity Reviews > Switch statement help

# Switch statement help

Mark
Guest
Posts: n/a

 01-09-2006
Hi - how can I get a switch statement to look for a range of values?

I have:

function payCalc(field, field2)
switch(field.value)
{
case 0-50: field2.value="lower band";
case 51-99: field2.value="mid band";
case 100-9999: field2.value="high band";
}

But this doesn't seem to work.

Thanks for any help,

Mark

*** Sent via Developersdex http://www.developersdex.com ***

Evertjan.
Guest
Posts: n/a

 01-09-2006
Mark wrote on 09 jan 2006 in comp.lang.javascript:

> Hi - how can I get a switch statement to look for a range of values?
>
> I have:
>
> function payCalc(field, field2)
> switch(field.value)
> {
> case 0-50: field2.value="lower band";
> case 51-99: field2.value="mid band";
> case 100-9999: field2.value="high band";
> }
>
> But this doesn't seem to work.

Switch is only handy for the godly that have read the specs.

For us mere mortals, to lazy to read them, use:

field2.value =
(field.value<0) ? "out-of-range" :
(field.value<51) ? "lower band" :
(field.value<100) ? "mid band" :
(field.value<10000)? "high band" :
"out-of-range" ;

--
Evertjan.
The Netherlands.

VK
Guest
Posts: n/a

 01-09-2006

Mark wrote:
> Hi - how can I get a switch statement to look for a range of values?

"switch" statement doesn't directly support ranges (like in VBS / VBA).
But you can work around that by comparing the case with true:

var num = 8000;

switch(true) {
case num>=0&&num<=51:
case num<=99:
case num<=9999:
default:
}

P.S. Unless you want to use (as suggested) more wide spread if-else if
- else block.

P.P.S. Also remember a very annoying cross-language bug in switch
construct: it executes all underlaying branches unless you stop it with
"break" statement.

Julian Turner
Guest
Posts: n/a

 01-09-2006

VK wrote:

[snip]
> P.P.S. Also remember a very annoying cross-language bug in switch
> construct: it executes all underlaying branches unless you stop it with
> "break" statement.

[snip]

Hello VK

Just interested in why you consider this to be a "bug"?

If I understand para 12.11 of the ECMA spec correctly
(<URL:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf>,
the production for a CaseClause or DefaultClause does not require the
"break" Statement to be included.

Further, leaving out the break statement can IMHO be useful sometimes
(if for instance you want a given Statement to be executed for more
than one case).

So perhaps rather than "bug", do you mean: "source of potential errors
for the unwary"?

Regards

Julian Turner

VK
Guest
Posts: n/a

 01-09-2006

Julian Turner wrote:
> VK wrote:
>
> [snip]
> > P.P.S. Also remember a very annoying cross-language bug in switch
> > construct: it executes all underlaying branches unless you stop it with
> > "break" statement.

> [snip]
>
> Hello VK
>
> Just interested in why you consider this to be a "bug"?

As I escaped the classical Comp.Sci. education I dare to call bug on
bug and sh** on sh** if I feel so )
In the particular I do not consider a nonsense to magically become a
lore just of being put in written (whoever wasted inks for it).

This has nothing to do with ECMA though - it's all the same: up to the
most pre-historic languages.
Why do I think it's a bug? Because it goes against the common
programming logic - and this is why people keep forgetting about
break's.

It's like having to put break after each function body so execution
wouldn't jump on underlaying function:
function foo() {
// ...
}
break;
function bar() {
// ...
}

- and w/o break after foo() we would immediately execute bar(). A lot
of sense? None. The same amount in
case X : ...; break; // IMHO

A perfect case of reversed logic for me. That would have some sense
maybe to have a flag to "continue" execution of underlaying branches -
but not a current annoyance twist.

IMHO IMHO IMHO

Lee
Guest
Posts: n/a

 01-09-2006
VK said:

>P.P.S. Also remember a very annoying cross-language bug in switch
>construct: it executes all underlaying branches unless you stop it with
>"break" statement.

That's not a "bug", moron, it's designed that way intentionally.

VK
Guest
Posts: n/a

 01-09-2006

VK wrote:
> A perfect case of reversed logic for me. That would have some sense
> maybe to have a flag to "continue" execution of underlaying branches -
> but not the current annoyance twist.

Also it breaks apart the boolean logic rules used in programming
languages:

case 10 :
case 20:
case 30:
default:

If switch happened to be equal 10, then after the first case: it also
equals to 20 and 30 ! (by the execution logic) As if program on its one
behalf would replace in:
if (statement1)
else if (statement2) {}
else if (statement3) {}
else {}
all statements with (true). Think how much would you like it!

Julian Turner
Guest
Posts: n/a

 01-09-2006

VK wrote:

> This has nothing to do with ECMA though - it's all the same: up to the
> most pre-historic languages.

Fair enough, fall-through (missing "break" statement) is a feature of
C++ and Java as well - e.g.

<URL:http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.11>

> Why do I think it's a bug? Because it goes against the common
> programming logic - and this is why people keep forgetting about
> break's.

You are entitled to your opinion. I thought, IHMO, it might just be
worth considering identifying it as an opinion, to avoid possible
confusion.

Nevertheless, I would agree that "fall-though" (despite its uses) is
not obvious from the structure of the switch statement, and so could
perhaps lead to code that is harder to follow.

Regards

Julian Turner

Lee
Guest
Posts: n/a

 01-09-2006
VK said:
>
>
>VK wrote:
>> A perfect case of reversed logic for me. That would have some sense
>> maybe to have a flag to "continue" execution of underlaying branches -
>> but not the current annoyance twist.

>
>Also it breaks apart the boolean logic rules used in programming
>languages:
>
>case 10 :
>case 20:
>case 30:
>default:
>
>If switch happened to be equal 10, then after the first case: it also
>equals to 20 and 30 !

As usual, you've done a fine job of convincing us that you don't
doesn't tell us that the switch equals 10, 20, and 30, it tells
us that 10, 20 and 30 are to be handled in the same way. It's
just that sort of distinction that you seem to have trouble with.

VK
Guest
Posts: n/a

 01-09-2006

Julian Turner wrote:
> VK wrote:
> > Why do I think it's a bug? Because it goes against the common
> > programming logic - and this is why people keep forgetting about
> > break's.

>
> You are entitled to your opinion. I thought, IHMO, it might just be
> worth considering identifying it as an opinion, to avoid possible
> confusion.

Fair enough
I guess from now on I'll be using terms not so heavily connected with
the programming entities. Then the "switch" behavior could be called
"common annoyance" (taken from the Firefox vocabulary).