I came across this unique practice in a browser detection script.
if (/MSIE/.test(_3)) {
IE = true;
} else {
if (/AppleWebKit/.test(_3)) {
Safari = true;
} else {
if (/Opera/.test(_3)) {
Opera = true;
} else {
if (/Camino/.test(_3)) {
Camino = true;
} else {
if (/Firefox/.test(_3) || /Netscape/.test(_3) || ) {
Mozilla = true;
}
}
}
}
}
Are there any advantages to using this nested If/Else method?
What if I just changed it to:
if (){
} else if (){
} else if (){
} else if (){
}
Would it run slower or anything?
I came across this unique practice in a browser detection script.
if (/MSIE/.test(_3)) {
IE = true;
} else {
if (/AppleWebKit/.test(_3)) {
Safari = true;
} else {
if (/Opera/.test(_3)) {
Opera = true;
} else {
if (/Camino/.test(_3)) {
Camino = true;
} else {
if (/Firefox/.test(_3) || /Netscape/.test(_3) || ) {
Mozilla = true;
}
}
}
}
}
Are there any advantages to using this nested If/Else method?
What if I just changed it to:
if (){
} else if (){
} else if (){
} else if (){
}
Would it run slower or anything?
Share Improve this question edited Nov 27, 2010 at 9:55 Sean Patrick Floyd 299k71 gold badges475 silver badges595 bronze badges asked Nov 27, 2010 at 9:49 Robin RodricksRobin Rodricks 114k147 gold badges414 silver badges617 bronze badges3 Answers
Reset to default 11It won't change anything other than the indentation and readability. Still the same code, absolutely equivalent :-) I would definitely change it though as it would make it more readable. Indentation usually means nesting whereas here there's no nesting.
This is known as "the arrow anti-pattern" (due to the resemblance to an arrowhead) ...
if if if if do something endif endif endif endif
.. and it's almost always bad for readability, unless there is some pelling reason to leave it.
http://www.codinghorror./blog/2006/01/flattening-arrow-code.html
I would flatten it.
In this case the switch
statement could also be used? Something like:
switch ((_3).match(/msie|applewebkit|opera|camino|firefox/i)[0]) {
case 'MSIE' : /* ...; */ break;
case 'AppleWebKit' : /* ...; */ break;
/* ... etc. */
default: BrowserCouldntBeDetermined = true;
}
I adhere to the previous answer: else if() is equivalent to but more readable then else { if () ...}
Anyway, the code you found and presented looks a bit clumsy and not really fast for other reasons than the way if...else
is used. Concerning the meaning of the code (and aside from the question), a better way to take care of browser differences is by object detection I would say.