| String | Number | NaN, except if string represents a number |
| String | Number | `NaN`, except if string represents a number |
| | | "5" --> 5, "0.001" |
| | | `"5"` --> `5`, `"0.001"` --> `0.001` |
| Array | Number | 0 if empty array, number if the only |
| Array | Number | `0` if empty array, number if the only |
| | | element is a number, NaN in any other case |
| | | element is a number, `NaN` in any other case |
| Object, Function | Number | NaN |
| Object, Function, undefined | Number | `NaN` |
| null | Number | 0 |
| null | Number | `0` |
| undefined | Number | NaN |
| Symbol | Number | THROWS! |
| Symbol | Number | THROWS! |
> Side note: I won't go too deep into operators, but a common misunderstanding among amateurs is that the "+" operator behaves unexpectedly. In fact, it does not. It's simply that the same operator acts as one of "summation" (when dealing with numbers), "concatenation" (when dealing with strings), or the "unary plus" operators depending on context. Anything else you attempt to pass to it will result in coercion to either a string or number. We'll come back to this.
> Side note: I won't go too deep into operators, but a common misunderstanding among amateurs is that the "+" operator behaves unexpectedly. In fact, it does not. It's simply that the same operator acts as one of "summation" (when dealing with numbers), "concatenation" (when dealing with strings), or the "unary plus" operators depending on context. Anything else you attempt to pass to it will result in coercion to either a string or number. We'll come back to this.