
1.2.3 通过相对路径添加和修改浏览器记录
history.pushState或history.replaceState,除支持绝对路径导航外,还支持相对路径导航,如:

熟悉Node.js的读者,可参考url.resolve相对路径的解决规则。对于相对路径导航,其遵循以下规则。
如果路径以“/”开头,则会替换掉整个路径。
如果路径不以“/”开头,则会得到相对当前URL地址的路径(在浏览器无base元素存在的情况下),根据路径解决规则会替换URL地址中的最后一级目录,即最后一个“/”分隔符后面的路径部分,如:

注意,如果当前路径的最后一个字符为“/”,则可认为“/”后紧接空字符串,执行相对路径导航会替换空字符串部分。

如果路径中含有“.”“..”,则表示当前路径及上一级路径。


对于不带具体路径名的操作,可认为其设置最后一级路径为空字符串。

对于不带“.”的路径,如pushState(null,null,'four'),其默认为pushState(null,null,'./four')。
同时,如果URL最后一个字符为“/”,最后一级路径为空字符串,并且当调用window.history.pushState(null,null,'.')把当前路径也设置为空字符串时,由于最后一级路径都为空字符串,URL将不发生任何变化。
对于“..”操作符,其表明回到上一级路径。

同样,如果“..”不带具体的路径名,则根据路径解决规则将认为其设置上一级路径为空字符串。

或者

当URL最后一个字符为“/”,最后一级路径为空字符串时,也遵循同样的规律:

如果路径以“?”或“#”作为跳转URL的第一个字符,则浏览器会基于当前的路径地址进行跳转,并会设置对应的参数。
search情况:

hash情况,在链接后面拼接:

注意,在仅调用history.pushState改变search的值时,hash的值会被清理:

如果调用history.pushState方法,则需注意此时栈记录的数量依然会改变。

