History对象History对象保存了当前窗口访问过的所有页面的URL。出于安全原因,浏览器不允许脚本读取这些地址,但允许在它们之间导航。浏览器工具栏上的“前进”和“后退”按钮实际上是在对历史对象进行操作。如果URL的锚值(即哈希)发生变化,也会在History对象中创建一条浏览记录。属性history.length:当前窗口(包括当前网页)访问的URL数。state:History栈顶层的状态值。通常未定义,即未设置。方法history.back():移至上一个URL,相当于点击浏览器的后退按钮。对于访问的第一个URL,此方法无效。forward():移动到下一个URL,相当于点击浏览器的前进按钮。此方法对上次访问的URL没有影响。go():接受一个整数作为参数,根据当前URL移动到参数指定的URL,例如go(1)相当于forward(),go(-1)相当于back().如果参数超出了实际URL的范围,则该方法无效;如果不指定参数,默认参数为0,相当于刷新当前页面。pushState():用于在历史记录中添加一条记录。它不会触发页面刷新,只会导致History对象改变,地址栏会响应。如果pushState的URL参数设置了新的锚点值(即hash),则不会触发hashchange事件。replaceState():用于修改History对象的当前记录,其他与pushState()方法完全相同。事件popstate:每当同一文档(即history对象)的浏览历史发生变化时,就会触发popstate事件。仅仅调用pushState()方法或replaceState()方法不会触发事件,只有用户点击浏览器后退按钮和前进按钮,或使用JavaScript调用history.back()、history.forward()、history.go()方法将被触发。Location对象Location对象是浏览器提供的原生对象,提供与URL相关的信息和操作方法。这个对象可以通过window.location和document.location属性获得。属性href:整个URL。protocol:当前URL的协议,包括冒号:。主持:主持。如果端口不是协议默认值80和433,还包括冒号:和端口。主机名:主机名,不包括端口。端口:端口号。pathname:URL的路径部分,以根路径/开头。search:查询字符串的一部分,以问号?开头。hash:片段字符串的一部分,从#开始。用户名:域名前的用户名。password:域名前的密码。origin:URL的协议、主机名和端口。//当前URL是http://user:passwd@www.example.com:4097/path/a.html?x=111#part1location.protocol//"http:"location.host//"www.example.com:4097"location.hostname//"www.example.com"location.port//"4097"location.pathname//"/path/a.html"location.search//"?x=111"location.hash//"#part1"location.username//"user"location.password//"passwd"location.origin//"http://user:passwd@www.example.com:4097"在这些属性中,只有origin属性是只读的,其他属性是可写的。注意,如果你向href写入一个新的URL地址,浏览器会立即跳转到这个新地址。通常用于自动将网页滚动到新的锚点。location.href='#top';//等价于location.hash='#top';URL编码与解码网页的URL只能包含合法的字符。合法字符分为两类:URL元字符:分号;、逗号,、斜杠/、问号?、冒号:、@、&、等号=、加号+、美元符号$、井号#。语义字符:a-z、A-Z、0-9、连字符-、下划线_、点.、感叹号!、波浪号~、星号*、单引号'、括号()。除上述字符外,URL中出现的其他字符都要进行转义,每个字节转换为百分号%加两个大写十六进制字母。URL编码/解码方法JavaScript提供了四种URL编码/解码方法:encodeURI():用于对整个URL进行转码。它的参数是一个代表整个URL的字符串。它转义元字符和语义字符以外的字符。encodeURIComponent():用于对URL的组成部分进行转码,除语义字符外的所有字符都会被转码,即元字符也会被转码。因此,它不能用于转码整个URL。它接受一个参数,即URL的一个片段。decodeURI():用于解码整个URL。它与encodeURI()方法相反。它接受一个参数,即转码后的URL。decodeURIComponent():用于解码URL片段。它与encodeURIComponent()方法相反。它接受一个参数,即转码后的URL片段。URL构造函数newURL(input[,base]):通过解析相对于base的输入来创建一个新的URL对象。输入:要解析的绝对或相对URL。如果输入是相对路径,则需要base。如果输入是绝对路径,则忽略base。base:如果输入不是绝对路径,则要解析的基本URL。url对象的URL实例的属性与Location对象基本相同,返回当前URL的信息。url.href:返回整个URLurl.protocol:返回协议,以冒号结尾:url.hostname:返回域名url.host:返回域名和端口,包括:号,默认端口80和443会省略url.port:返回端口url.origin:返回协议、域名和端口url.pathname:返回路径,以斜杠开头/url.search:返回查询字符串,以问号开头?url.searchParams:返回URLSearchParams的一个实例,该属性是Location对象没有的url.hash:返回段标识符,以#开头url.password:返回域名前的密码域名前的用户名URLSearchParams对象URLSearchParams对象是浏览器的原生对象,用于构造、解析和处理URL的查询字符串(即URL中问号后面的部分)。它本身也是一个构造函数,可以生成实例。参数可以是查询字符串,开头可以带问号也可以不带问号,也可以是查询字符串对应的数组或对象。//方法一:传入一个字符串letparams=newURLSearchParams('?foo=1&bar=2');//等价于letparams=newURLSearchParams(document.location.search);//方法二:传入一个arrayletparams=newURLSearchParams([['foo',1],['bar',2]]);//方法三:传入对象letparams=newURLSearchParams({'foo':1,'bar':2});实例方法toString():返回实例的字符串形式。append():用于追加一个查询参数。它接受两个参数,第一个是键名,第二个是键值,没有返回值。将无法识别键名是否已存在。letparams=newURLSearchParams('?foo=1&bar=2');params.toString()//"foo=1&bar=2'params.append('foo',3);params.toString()//"foo=1&bar=2&foo=3"delete():用于删除指定的查询参数。接受键名作为参数。params.delete('bar');set():用于设置查询字符串的值。接受两个参数,第一个是键名,第二个是键值,如果是已经存在的键,会重写键值,否则追加。如果有多个同名键,set会去掉重复的key,只留一个get():用于读取查询字符串中指定的key,接受key名作为参数,首先返回一个字符串,如果原值是一个值,则需要改变类型;其次,如果指定的键名不存在,则返回值为null。如果有多个同名键,则get返回最前面的键值。getAll():返回一个数组,其成员都是指定键的键值。接受键名作为参数。sort():对key进行排序,规则是按照Unicode码位从小到大排列。没有返回值。如果有两个同名的key,则不进行排序,而是保留原来的顺序。keys():返回键名的遍历器。values():返回键值的遍历器。entries():返回键值对的遍历器。forEach():遍历每一个键值对。letparams=newURLSearchParams('a=3&b=6')params.forEach((value,key,params)=>{console.log(value,key);//3a//6b})for(const参数名称.keys()){console.log(name);//ab}for(constnameofparams.values()){console.log(name);//36}for(constnameofparams.entries()){console.log(name);//['a','3']['b','6']}
