Grammar is not a joke...
Exactly, in Javascript's grammar there's no else if
statement.
How many times have you used it before? Why It's still working?
We always code like this:
function wow(arg){
if(arg === "dog"){
return "LOVELY";
}
else if(arg === "cat"){
return "CUTE";
}
else return "gimme an animal";
}
wow("cat");
//-> "CUTE"
But what's really happening is this:
function wow(arg){
if(arg === "dog"){
return "LOVELY";
}
else {
if(arg === "cat"){
return "CUTE";
}
else return "gimme an animal";
}
}
wow("cat");
What's happening here?
Literally, we're using some implicit JS behavior about {}
uses.
When we use the else if
statement we're omitting the {}
but Javascript It's still working because It does not requires the parentheses in that case, like in many other cases!
...so what?
I'm not writing this post, just because It's something really curious to know.
I'm writing this to make you think about all the good parts or right ways to code, that forces you to write code in a way, that sometimes It's not really the best way.
There's a lot to discuss about implicit and explicit declaration of stuff like: coercion, parentheses, semicolon...
But the true always stands in the middle!.
If you just follow some specific rules on how to... you're not understanding why those rules were written, and this else if
should make you think about It.
How many time have you written code, because someone told you to do so but you were totally blind about It?
I bet, a lot.
I'm not saying that we should not care about ALL those rules, and that we should know ALL the JS documentation.
I'm just saying that right now, your duty is to write good code that can be understood by someone else and to go that way... some rules are ok, but you should know the why.
Because someone is good at code, It does not mean that you have to follow his golden rules.
What's implicit for him, maybe explicit for you and many other people.
If you don't have the same knowledge, about that specific argument (and It's not possible to have exactly the same level of know about It in every single part of the code) you've two options:
- Do what he's telling you to do... If It works.
- Go out and check the why
Always care about the good parts but first of all, always care about your knowledge and don't code just by rules.
Top comments (98)
LOL
I guess technically,
if
statements could have been omitted in this example (though thereβd still be a conditional present).I think above code needs one more condition.
If I want to replace above code. I would do something like this. (with conditions)
LOL...nice.
can someone explain to me why you can use parathesis instead os curly braces with an arrow function? I was thought that the parathesis are used to indicate to the compiler that what is encapsulated in the parathesis are supposed to be treated as parameters, and what is in the curly braces are supposed to be treated as the logic.
This goes to the point trying to be made by Fabio Russo "the good parts or right ways to code...It's not really the best way."
Your information is not incorrect for regular functions. However, with an arrow function, you are allowed to use parentheses to represent a function body with a single statement (useful when spanning multiple lines).
There are other places you can omit things as well.
Examples:
Single parameter, parentheses are optional
Multiple parameters require parentheses
Function body needs curly braces for multi-line command block
However, if your body is a single line and you want to return the result, you may do any of the following (all of these return the value of name.toUpperCase()
It really helps if you have a command that spans multiple lines where you just want to return the result. So, for example, if you were dealing with a promise you could do either of the following:
Now, I understand that you're able to use arrow functions in more diverse ways, but after looking at the code I had trouble with I realize that pranay rauthu used a "hidden if-statement" how does one use the ampersand(&) to make a conditional, and to see if arg === some-value, and print a value based on what the client set arg equal to.
If someone has a response to my question, please point me to some resource so I can deepen my knowledge on javascript
I gues you would like this piece
hackernoon.com/rethinking-javascri...
Actually I didnβt misunderstand. I was really just having a little coding fun at your expense because I disagree with your statement. Personally, I believe that anyone that states something along the lines of βnever do xyz no matter the circumstanceβ (not your exact words, I know) has a flawed approach to design and development. Decision/branching is a normal part of what we do. Whether you use an
if
statement or some other form becomes trivial in the grand scheme. I agree that it is not always the best way but equally disagree that it is always wrong.Cool point. In cases like this, I often forgo the
else
altogether because of thereturn
statements.Still, your point about understanding the why behind what we write is an important one. Thanks for sharing.
A function with only
if
s that return is just the missing-from-JS pattern matching+guards syntax.Another blind gospel: braces around if-statements imply that people don't understand what braces do (they turn a group of statements into a single statement). So rules like "always put braces around the body of your if-statement" get it backwards, it'd be like wrapping every value in an array, because maybe you'll want more than one of them, someday.
This brings us to the the three-brace rule: if you're going to make me put one brace where I don't need it, then I'm going to add two more.
Now, in people's defense, JavaScript's syntax is terrible, it's absurd that this works (when it would be so much more useful to have toplevel objects), and given that it works, it's absurd that you can't drop the braces around function bodies.
And the other super obnoxious mostly un-understood rule: littering semicolons all over the code. Literally after every line that they can, rather than before the ones that cause the problems. It's especially misguided b/c it masks the actual problem lines, and it gives a false implication that omitting the semicolon would mean it continues on the next line. But that isn't true, JS doesn't need a semicolon to terminate the line, only to terminate it early. The reason you stick them at the end is b/c sometimes the next line says "oh hey... Imma tag along with the previous line", so with this dumb rule, every line has to guard against an aggressive next line.
I agree it's interesting that you can't drop the braces around function bodies (which hadn't occurred to me before) but the example in the post, of where
else if ...
is actuallyelse { if ... }
seems obvious. Isn't that behaving exactly how it's written, and isn't that how everyone would expect it to work if they'd never seen the language before?It's not.
Because we're always encouraged to use
{}
in some ways, and we learn by memory to use those, without knowing the why.During the first approach to a language, you cannot be so deeply analytic, because you've to trust the rules, or you will never go on.
After the totally beginner phase, you should start to ask yourself the why.
Have you ever encountered a bug caused by missing parentheses? Being consistent improves code readability and makes it easier to identify bugs.
It's not about... DON'T USE PARENTHESES :D It's all about know the why of parentheses
This proves that grammar in JS is a joke!
I know what you're talking about.
But do we know, why It's still working?
It's working because of blocks.
You're creating blocks, inside blocks... inside blocks.
That's important in JS, because of the lexical-scope.
I'm not saying that's ok ... I'm just saying that in JS It works like that, not just because It's bad
Apparently I didn't use the word
block
in there, but yes, I understand this :)If you want to be really irritated with JS, figure out what's going on with these examples (hint)
Without braces, how would the interpreter / a fellow developer know where the function ends? If you write
then how often are you expecting to see Hello logged? Three times? Four times? Zero times? An unbounded number of times due to recursion?
Some languages use whitespace or
end
, but I find the braces to be more readable and less error prone.I'd expect three times. The
function foo(x)
would receive the next syntactic element as its body, which isconsole.log(x)
. Not because of indentation, but because it's the next expression. If you wanted more than one expression, you would use the braces to make a block, which would group the multiple expressions into one. Then it would be consistent with the way we use blocks on if statements.Oh, also note that this is how fat arrows work:
Python developer disagrees. πππ
Alright, but then you are just hiding the if-statement within the
is_odd
method. There is no sane way to implement these types of functions, that take an integet and return a boolean, without if-statements.I highly doubt that pattern matching can be faster than if-statements in any language, since pattern matching on non-enum types would have to be implemented using conditional jumps (i.e. if-statements) in the underlying machine code or VM code.
Only use conditional jumps...wait! xD
This is incorrect. The inclusion of
if
isn't a matter of legacy, it's becauseif
is a low level primitive that can be used to build higher level abstractions. That is why Lisp hasif
; the thesis of Lisp is to expose a small set of primitives, allowing developers to leverage those primitives to build the language they need. While I agree that many developers reach forif
when a higher level of abstraction would be more appropriate, there should be no golden rule to "never useif
". Sometimes a lower level of abstraction is what is appropriate for a task.But surely some tasks just require if-statements? What if you receive an integer from user input and want to know if it is positive or not? What if you want to filter out all odd numbers out of a list? Isn't pattern matching on something with two cases just an if-statement with the first case as a condition?
Thanks for the write-up. This kinda reminds me of that beginner's guide to shell scripting article that opened our minds to the fact that when we use
if
brackets in bash we're actually usingtest
;).How can you have any flow control without some sort of if-statement?