You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:解析String扩展方法中处理arguments的关键代码逻辑

拆解JavaScript字符串格式化工具中的参数处理逻辑

先贴出你复制的完整字符串格式化代码:

module.exports=function(){
    String.prototype.FormatPlus = String.prototype.FormatPlus || function(){
        "use strict";
        let str = this.toString();
        if (arguments.length) {
            let t = typeof arguments[0];
            let key;
            let args = ("string" === t || "number" === t) ? Array.prototype.slice.call(arguments) : arguments[0];
            
            for (key in args) {
                str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]);
            }
            
            return str;
        }
    }
}

你疑惑的这行代码,核心是让这个格式化函数支持两种不同的传参方式,下面逐段拆解:

let args = ("string" === t || "number" === t) ? Array.prototype.slice.call(arguments) : arguments[0];

1. 条件判断部分:("string" === t || "number" === t)

  • 这里的t是之前代码中typeof arguments[0]的结果,也就是判断第一个传入的参数是否为字符串或数字类型。

2. 三元运算符的两个分支

三元运算符? :会根据前面的条件结果,选择执行对应的代码:

  • 当条件为真(第一个参数是字符串/数字):执行Array.prototype.slice.call(arguments)
    • arguments是JS函数里自带的类数组对象,它能获取到所有传入函数的参数,但不能直接使用数组方法。Array.prototype.slice.call(arguments)的作用是把这个类数组转换成真正的数组,比如传入"张三", 20,转换后得到["张三", 20],后续就能通过索引0、1对应字符串里的{0}、{1}占位符。
  • 当条件为假(第一个参数是对象):直接取arguments[0]
    • 这时候用户传入的应该是一个键值对对象,比如{name: "张三", age: 20},直接取这个对象后,后续就能通过键名name、age对应字符串里的{name}、{age}这类命名占位符。

整体作用

这行代码让FormatPlus函数同时支持两种调用场景:

  • 场景1:"我叫{0},今年{1}岁".FormatPlus("张三", 20)
  • 场景2:"我叫{name},今年{age}岁".FormatPlus({name: "张三", age: 20})

内容的提问来源于stack exchange,提问作者Devepation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:39:25