封装一个获取url中的参数的方法

388 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

在平时项目中,我们或多或少都会遇到一些处理连接中的参数的问题

此次封装,我们实现了以下几点要求

(1) 指定参数名称,返回该参数的值 或者 空字符串 (2) 不指定参数名称,返回全部的参数对象 或者 {} (3) 如果存在多个同名参数,则返回数组 (4) 不支持URLSearchParams方法

function getUrlParam(url, key) {
  let result = {}
  url.replace(/\??(\w+)=(\w+)&?/g, (str, keyname, val) => {
    if (result[keyname] !== void 0) {
      let lastVal = result[keyname]
      result[keyname] = [].concat(lastVal, val)
    } else {
      result[keyname] = val
    }
  })
  if (key === void 0) {
    return result
  } else {
    return result[key] || ''
  }
}

上面代码中void 0 返回undefined,但是为什么不直接使用 arguments[0] !== undefined?因为undefined在 ES5 中已经是全局对象的一个只读(read-only)属性了,它不能被重写。但是在局部作用域中,还是可以被重写的. void 运算符能对给定的表达式进行求值,然后返回 undefined。也就是说,void 后面你随便跟上一个表达式,返回的都是 undefined,如 void (2), void (‘hello’)。并且void是不能被重写的。但为什么是void 0 呢,void 0 是表达式中最短的。用 void 0 代替 undefined 能节省字节。不少 JavaScript 压缩工具在压缩过程中,正是将 undefinedvoid 0 代替掉了