Today I happened to have too much time to kill and I played a bit with the Node (v0.10.13) command line:
> 1 instanceof Object
false
> (1).__proto__
{}
> (1).__proto__ instanceof Object
true
> (1).__proto__.__proto__ === Object.prototype
true
Now, according to MDN, what instanceof does is:
The instanceof operator tests whether an object has in its prototype chain the prototype property of a constructor.
But clearly Object.prototype IS in 1's prototype chain. So why is 1 instanceof Object false? Perhaps because 1 is a primitive not an object to begin with?
Okay, I accept that, and I did more tests:
> (1).__proto__ === (2).__proto__
true
> 'a'.__proto__ === 'b'.__proto__
true
> (1).__proto__ === 'a'.__proto__
false
> (1).__proto__.__proto__ === 'a'.__proto__.__proto__
true
> (1).__proto__.type = 'number'
'number'
> 'a'.__proto__.type = 'string'
'string'
> (2).type
'number'
> (1.5).type
'number'
> 'b'.type
'string'
So apparently all number primitives inherit from one object, and all string primitives inherit from another object. Both these 2 objects inherit from Object.prototype.
Now the question is, if numbers and strings are considered primitives, why inherit them from other objects? Or inversely, as they inherit from other objects, why not consider them objects too? It seems nonsensical to me that the child of an object isn't an object..
By the way, I have also tested these in Firefox 22 and got the same result.