你不用URL?

在操作Url地址的时候,你还在正则匹配 + 字符串操作的刀耕火种的时代吗,费时费力,还容易出错。这里介绍一种方式,让你轻松拿捏。

这种方式就是使用URL

1. 兼容性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EGjSgzbb-1661602661011)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fb39cf864fe4495c96ef55d7a2c2f826~tplv-k3u1fbpfcp-watermark.image?)]

从图中可以看出,大部分的主流浏览器都是兼容的。当然如果存在兼容性的问题,可以使corejspolyfill: web.url.constructor

2. URL

URL是一个构造函数,接受两个参数

    // 签名
    new URL(url, base)

传参有两种方式:

  • 绝对路径
const absUrl = new URL('https://juejin.cn/editor/drafts/7136116704933281799')

// absUrl实例有个toString方法,可以获取完整的location.href
absUrl.toString() // https://juejin.cn/editor/drafts/7136116704933281799
  • 相对路径
const relUrl = new URL('../test-url', 'https://juejin.cn/editor/drafts/7136116704933281799')
absUrl.toString() // https://juejin.cn/editor/test-url

3. 实例属性

通过URL构造一个对象之后,可以看下原型链:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bM9C8gZN-1661602661012)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a8e6036031a74bd586f1a9ac6ac5130e~tplv-k3u1fbpfcp-watermark.image?)]

从图中可以看出,location中的属性href,hostname,pathname,hash。。。甚至protocol都设置了settinggetter。但是, origin是没有setter的,因为origin是由其他属性 protocal + hostname + port拼接的。(的有了getter可以轻松从对象中获取这些属性值,而重要的是有setter,可以轻松修改这些值。

const juejin = new URL('https://juejin.cn/editor/drafts/7136116704933281799')

juejin.protocol = 'http:'  // 修改协议
juejin.pathname = '/frontend' // 修改路径
juejin.port = '9999'
juejin.hostname = 'juejin' // 路径
juejin.search = 'drafts=7136116704933281799'
juejin.hash = 'tny'

juejin.toString() // http://juejin:9999/frontend?drafts=7136116704933281799#tny

4. URLSearchParams

针对 search,还有一个方法,URLSearchParams,他可以更细粒度的操作search

const t = new URLSearchParams('a=b&c=d')
t.toString() // a=b&c=d
// 添加新的key=value键值对
t.append('e', 'f') // a=b&c=d&e=f
// 修改
t.set('a', 'b1') // a=b1&c=d&e=f
// 如果不存在就添加
t.set('a1', 'b1a1') // a=b1&c=d&e=f&a1=b1a1

// 排序
t.sort() // a=b1&a1=b1a1&c=d&e=f

// 实例是可迭代的
// 所有支持for...of...
for(let k of t) {
  console.log(k) // ['a', 'b1'] ['a1', 'b1a1'] ['c', 'd'] ['e', 'f']
}
// 同样的 entries() 和 keys() 和 values() 的值都是 迭代器 所以都可以被迭代取值
[...t.entries()] // [['a', 'b1'], ['a1', 'b1a1'], ['c', 'd'], ['e', 'f']]
[...t.keys()] // ['a', 'a1', 'c', 'e']
[...t.values()] //  ['b1', 'b1a1', 'd', 'f']

// 可以通过has判断是否存在key
t.has('a1') // true
t.has('g') // false

// 通过get获取值
t.get('a1') // b1a1
t.get('g') // null 不存在

5.总结

通过构造函数URLURLSearchParams以及实例方法可以方便可靠地操作url,解脱于正则和字符串操作的水深火热。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值