Javascript when doing operations between to variables will try to coerce them into the strongest type that both support... in your example that is String, in this case ({}).toString() == "[object Object]" ... which is why you get the result. Your not understanding how a system works is not an error in the system.
What would you expect in your example? A deep copy/merge, a shallow copy/merge... right merged with left and result returned?