Javascript and weakly defined types

Javascript is a weakly typed language, a variable can be equal to another if they have the same value even if they are different types.

As a result, Javascript has two equality operators;
== checks if the values of the compared objects are equal
=== checks if the values and types of the objects are equal

var fiveAsText = '5';
var fiveAsNumber = 5;

fiveAsText == fiveAsNumber // outputs true
fiveAsText === fiveAsNumber // outputs false

This can lead to some unusual behaviour when dealing with different types. For instance, when you perform mathematical operations on a string type with a numeric value

var five = '5';
var three = 3;

five + three // "53", string concatenation interprets the '5' as a string and overrides the addition operator
five - three // 2, subtraction interprets the '5' as a number

Update (28th August 2015)

A perfect example of the confusion that this can cause is as below

The explanation isn''t exactly intuitive but at least shows that there is some sort of logic behind it all

+ is overloaded as both the addition and string concatenation operator.

In mixed operations:

+ casts numbers to strings.

- casts strings to numbers.

Both are used to denote signage. Leading either on a string will cast it to a number, with that sign.

Pretty simple stuff, right?

Explicitly:

Number('5') - 3
'5' + (3).toString()
'5' + (5).toString()
'foo' + Number('bar').toString()
'5' + (-Number('2')).toString()
// Long ass sign flipping, same as above
Number(('5' + (3).toString())) - 3
(Number('5') - 3) + 3

The above explanation is courtesy of /u/RewindHoodie from Reddit''s /r/ProgrammerHumor