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?
It 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 compelling reason to leave it.
http://www.codinghorror.com/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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With