Visit stackoverflow.com/#_=_
and window.location.hash
evaluates to #_=_
. Fine.
Now execute window.location.hash = \'\'
There are 2 things driving this behaviour:
So basically, setting the hash property should never lead to a reload, setting any other property should lead to a reload (or perhaps an E-Tag/modified-since header check, depending on browser settings).
I would assume that for the sake of consistency, browser builders transform setting an empty hash, to setting '#' as hash. This way the url in the location bar does not lead to a reload. But this latter part is pure speculation.
Answering to your first question:
According to the window.location doc in Mozilla.org: "the part of the URL that follows the # symbol, if there is one, including the # symbol. Empty string if the url does not contain # or has nothing after the #."
Curiously, that document was just updated on 4/8/2013. Not sure if that was added after you checked the documentation.
By the way (and in reference to the answers), the window.location.hash and pushState are different concepts although close related.
To answer the second question (removing the #
without a page refresh):
history.pushState('', document.title, window.location.pathname);