Also if you do
if ( { hello: 1 } === { hello: 1 } ){ console.log( "yay" ); }
the console.log never happen, because it's an object.
You can compare 2 literal objects (as my first example) by making a loop on these objects and when you find a difference you know the result.
It's more difficult to do this trick in an instantiated object, compare 2 functions it's crazy.
But if JavaScript don't do it for you it's because this is very heavy, you have check each type of each attributes to stringify it if it's a function etc... and obviously it's not useful to do it.
You can use instanceof if you want to check 2 objects "origins", because typeof will return you "object".
And for testing 2 "new String" object you have to use toString
new String( "hello" ).toString() == new String( "hello" ).toString()
or if you want to check the object without testing the attributes
new String( "hello" ) instanceof String && new String( "hello" ) instanceof String
is true.
The link given by BeyelerStudios explain perfectly what the new do, hope it'll help.