If statements can have brackets or not, and can also be used with an option else block that will fire if the condition is only not true. I generally always do use brackets with if statements even if it does have only one line of code becuase I find that it helps to make things more clear to me.
If a function that is being made that is using the return keyword to return a result when called then else does not need to be used. The reason why is that return will stop any further execution of any additional code, so it can be used as a way to break out of a function. This differs from blocks of code where I might only want some code to run if and only if a condition is not met.
Because the conditional operator is a kind of expression it can be used in conjunction with if statements.
Another way to control the flow of logic is to use state machines. This is typically a collection of two or more methods that will fire only when a variable or object property is a given value that will cause the method to fire. So I could have an object and a bunch of methods for a bunch of key names. I can then have a property that will be the key name of the current method to fire when a method is called. I then have some kind of way to change the value of this property that will control what method to fire.
State machines come into play when working on some kind of project that is a little advanced in which there are many application states. Such as a state in which assets need to be loaded, and a state that will run when all those assets are done loading.