解题思路:

  1. 获取参数字符串,即取得 "?" 与 "#" 之间的字符串
  2. 将参数字符串作为键值对存储起来
  3. 特殊情况判断返回
    1. 判断 指定 与 不指定 参数名称两种返回结果
    2. 判断 不指定 参数时 有结果 旧返回,无结果 返回空字符串''

完整代码

// 1. 获取参数字符串,即取得 "?" 与 "#" 之间的字符串
    const result = {}
    sUrl.match(/\?(.*)\#/)[1].split('&').forEach(item => {
        // 2. 将参数字符串作为键值对存储起来
        const tempArr = item.split('=')
        result[tempArr[0]] = !result.hasOwnProperty(tempArr[0]) ? 
            tempArr[1] : Array.isArray(result[tempArr[0]]) ? 
            [...result[tempArr[0]], tempArr[1]] : [result[tempArr[0]], tempArr[1]]
    })
    // 3. 特殊情况判断返回
    return sKey ? result[sKey] || '' : result

解惑:
result[tempArr[0]] = !result.hasOwnProperty(tempArr[0]) ? tempArr[1] : Array.isArray(result[tempArr[0]]) ? [...result[tempArr[0]], tempArr[1]] : [result[tempArr[0]], tempArr[1]]
这里面中:[...result[tempArr[0]], tempArr[1]] 意思是当 result[tempArr[0]] 是数组时将 ...result[tempArr[0]] 解构,同时与最新获得 tempArr[1] 合并成一个新的数组,即 [...result[tempArr[0]], tempArr[1]]
举个例子:

result[tempArr[0]] = [1, 2]
tempArr[1] = 3
[...result[tempArr[0]]] = [1,2]
[...result[tempArr[0]], tempArr[1]] = [1, 2, 3]