### Tricky alternatives to toString() and parseInt()

### JavaScript is Loosely typed

JavaScript is dynamically typed, making things extremely flexible. Suppose you have a text field for inputting birth year and want to greet to people born after 1984, simply write

var birthYear = document.getElementById('txtBirthYear').value;

if (birthYear > 1984) {

alert('Greetings!');

}

When JavaScript sees you compare a String with a Number, it automatically converts the String to Number and the perform comparison.

But sometimes the ambiguity of type causes problems. 1 + '1' evaluates to '11' instead of 2. This may cause hard to find bugs. Douglas Crockford categorizes "the overloading of + to mean both addition and concatenation with type coercion" as a design error of JavaScript in his famous article on The World's Most Misunderstood Programming Language.

Still we often need to convert data type between String and Number. To convert variable i to String, simply call i.toString(). To convert s to a Number, we use Number(s). This is nice and clear.

### The empty string ('') concatenation trick, the plus sign (+) trick and the minus zero (- 0) trick

But for guys who want to squeeze every byte. There are tricky alternatives.

- To convert x to String: x + ''
- To convert x to Number: +x
- To convert x to Number: x - 0

For examples,

1 + 2 + 3 //produces 6'1' - 0 + 2 + 3 //produces 6

//while

'1' + 2 + 3 //produces '123'

'1' + '2' //produces '12'

//while

+'1' + +'2' //produces 3

Notice that +x and x-0 doesn't mean parseInt(x) or parseFloat(x), it doesn't do any further parsing.

parseInt('2007 is promising') //produces 2007

//while

+'2007 is promising' //produces NaN

`Let's call them `*the empty string concatenation* conversion trick, *the plus sign* and *the minus zero* trick. Both of the tricks sacrifice clarity and make code harder to understand.