本文已参与「新人创作礼」活动,一起开启掘金创作之路
在平时项目中,我们或多或少都会遇到一些处理连接中的参数的问题
此次封装,我们实现了以下几点要求
(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 压缩工具在压缩过程中,正是将 undefined 用 void 0 代替掉了