ZBLOG

function urlDecode(url) { let urlObj = { scheme: undefined, addr: undefined, port: undefined, path: "", args: "", hash: "" }; function cutHash(url) {...

以下是对该 URL 解码函数的优化版本,主要改进点包括:

  1. 使用正则表达式简化字符串匹配
  2. 提取重复逻辑为独立函数
  3. 更清晰的变量命名和结构
  4. 增强类型安全性
function parseUrl(url) {
    const urlObj = {
        scheme: undefined,
        addr: undefined,
        port: undefined,
        path: "",
        query: "",
        fragment: ""
    };

    // Helper functions
    const extractFragment = (str) => {
        const [path, fragment = ""] = str.split("#");
        return { path, fragment: fragment ? `#${fragment}` : "" };
    };

    const extractQuery = (str) => {
        const [path, query = ""] = str.split("?");
        return { path, query: query ? `?${query}` : "" };
    };

    const parseAuthority = (authority) => {
        if (!authority) return;

        // Handle IPv6 addresses
        if (authority.startsWith("[")) {
            const ipv6End = authority.indexOf("]");
            if (ipv6End === -1) return; // Invalid format
            
            urlObj.addr = authority.substring(1, ipv6End);
            const portSeparator = authority.indexOf(":", ipv6End);
            if (portSeparator !== -1) {
                urlObj.port = authority.substring(portSeparator + 1);
            }
            return;
        }

        // Handle IPv4/hostname and port
        const [host, port] = authority.split(":");
        urlObj.addr = host;
        if (port) urlObj.port = port;
    };

    // Main parsing logic
    url = url.trim();
    
    // Extract fragment first
    let { path, fragment } = extractFragment(url);
    urlObj.fragment = fragment;

    // Determine scheme if present
    const schemeMatch = path.match(/^(https?):\/\//i);
    if (schemeMatch) {
        urlObj.scheme = schemeMatch[1].toLowerCase();
        
        // Set default ports based on scheme
        urlObj.port ||= urlObj.scheme === "https" ? "443" : "80";
        
        // Remove scheme prefix for further processing
        path = path.slice(schemeMatch[0].length);
        
         // Handle protocol-relative URLs (//example.com)
         if(path.startsWith('//')){ 
             path=path.slice(2); 
         }
     } else if(path.startsWith('//')){
         path=path.slice(2); 
     }

     // Split into authority and path/query components 
     let authorityEnd=Math.min(
         ...[ '/', '?', '#' ].map(s=>{
             const idx=path.indexOf(s); 
             return idx===-1?Infinity:idx; 
         })
     );
     
     let authority=''; 
     let restPath=''; 

     if(authorityEnd!==Infinity){
         authority=path.slice(0,authorityEnd); 
         restPath=path.slice(authorityEnd); 
     }else{
         authority=path; 
     }

     parseAuthority(authority);

     // Process remaining path and query parameters  
     if(restPath){  
         let {path:p,q}=extractQuery(restPath);  
         Object.assign(urlObj,{  
             path:p||'',  
             query:q||''  
         });  
      }  

      return cleanEmptyFields(urlObj);  

      function cleanEmptyFields(obj){  
          return Object.fromEntries(  
              Object.entries(obj).filter(([,v])=>v!=='')  
          );  
      }
}

主要优化说明:

  1. 模块化设计

    • 将不同功能拆分为独立的辅助函数(extractFragment, extractQuery, parseAuthority
    • 每个函数只负责单一职责
  2. 更清晰的逻辑流

    • 按照URL解析的自然顺序处理:片段→协议→授权部分→路径和查询参数
  3. 改进的字符串处理

    • 使用split()代替手动字符遍历
    • 用解构赋值简化多返回值处理
  4. 更好的默认值处理

    • 使用空字符串作为默认值而不是undefined
  5. 增强的健壮性

    • 添加对协议相对URL(//example.com)的支持
    • 更好的IPv6地址处理
  6. 代码可读性提升

    • 更一致的命名规范(如query代替args,fragment代替hash)
    • 移除不必要的中间变量
  7. 性能优化

    • 减少不必要的字符串操作和循环次数

这个版本保持了原始功能的同时,通过现代JavaScript特性和更清晰的架构大幅提升了代码的可维护性和可读性。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8081

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?