* is a multiplicative operator, it calls the specification's
ToNumber abstract operation on both of its operands (first the left one, then the right one). The result of
0 (see the link for a table), so
8 * 0 is
- is a subtraction operator, it also calls
ToNumber on its operands. So you get
5 - 1 which is
+ operator has two meanings: Mathematical addition, and string concatenation. If either operand is a string, you get concatenation, not addition. More formally: It first converts its operands to primitives via the spec's abstract
ToPrimitive operation, and then determines whether either operand's primitive value is a string, and does concatenation if so. In the case of
+, it doesn't matter which operand (the left or right) is a string, it can be either and that makes it concatenation rather than addition.
It's spelled out in very, very thorough detail in the specification, so if you have any doubts in a particular situation, that's where to look.