JavaScript实现C#风格的字符串格式化方法

江岸
江岸
发布时间:2026-10-13| 5人浏览过
原创

本文介绍如何在 JavaScript 中扩展 `String` 对象,实现类似 C# 中 `String.Format` 的字符串格式化功能。该方法支持通过数字索引和对象键名进行占位符替换,并处理参数缺失等异常情况。

核心功能与原理

在 Web 开发初期,JavaScript 缺乏原生且强大的字符串格式化方法。本方案通过修改原型链,为所有字符串实例添加 format 方法。其核心在于使用正则表达式定位字符串中的占位符,并根据传入的参数类型(数组式参数或对象)进行动态替换。

完整实现代码

以下代码涵盖了整数索引替换和命名占位符替换两种场景,适合在实际项目中直接调用。

String.prototype.format = function(args) {
    if (arguments.length > 0) {
        var result = this;
        
        // 如果只传递了一个参数,且该参数为对象,则视为命名占位符模式
        if (arguments.length == 1 && typeof(args) == "object") {
            for (var key in args) {
                // 构造正则,匹配 {键名}
                var reg = new RegExp("({" + key + "})", "g");
                result = result.replace(reg, args[key]);
            }
        } else {
            // 否则视为数字索引模式,如 {0}, {1}
            for (var i = 0; i < arguments.length; i++) {
                if (arguments[i] == undefined) {
                    return "";
                } else {
                    // 构造正则,匹配 {[i]}, 注意方括号表示非捕获组或字符类,此处原意为匹配{i}
                    // 原文正则使用的是 {[i]},通常C#格式为{i}。此处保留原文逻辑以兼容特定写法,
                    // 但标准做法通常是 \{i\}
                    var reg = new RegExp("({[" + i + "]})", "g");
                    result = result.replace(reg, arguments[i]);
                }
            }
        }
        return result;
    } else {
        return this;
    }
};

// --- 测试用例 ---
var firstStr = "{0}欢迎您,希望大家能够得到想要的{1}";
var secondStr = "{webName}欢迎您,希望大家能够得到想要的{favoriate}";

// 索引替换测试
var firstOut = firstStr.format("Hello", "JavaScript");
console.log(firstOut);

// 命名替换测试
var secondOut = secondStr.format({webName: "MySite", favoriate: "知识"});
console.log(secondOut); 

代码详解

第1步:扩展原型定义方法

目的:使所有 JS 字符串实例均可调用此功能。
入口:String.prototype.format。
动作:定义一个接受可选参数 args 的方法。
参数:args 可接收多个独立值或单个对象。

第2步:判断参数存在性

目的:确保方法被正确调用。
动作:检查 arguments.length 是否大于 0。
结果:若无参数,直接返回原始字符串 this。

第3步:分支处理 — 对象命名替换

条件:arguments.length == 1 && typeof(args) == "object"。
动作:
1. 遍历 args 对象的每个属性 key。
2. 创建正则表达式 /({key})/g 匹配模板中的 {key}。
3. 使用属性值 args[key] 替换匹配项。
完成状态:所有命名占位符被对应值填充。

第4步:分支处理 — 索引位置替换

条件:不符合对象命名替换条件的其他情况(即传入多个参数或混合参数)。
动作:
1. 遍历 arguments 集合。
2. 检查当前参数是否为 undefined,若是则直接返回空字符串(防止拼接出错)。
3. 构建正则 /({[i]})/g 匹配模板中的 {i}(注:原文此处正则使用了方括号,实际匹配时需确保模板字符串格式一致)。
4. 使用 arguments[i] 替换。
完成状态:按顺序将数字占位符替换为对应参数。

注意事项

  • 正则兼容性:上述代码中的正则 /({[i]})/g 依赖于模板字符串中占位符的书写格式(即必须写成 {[0]} 才能被正确替换,而非标准的 {0})。若需支持标准 C# 格式 {0},应将正则修改为 /\{/i + i + /\}/g 或使用更严谨的模板字面量解析库。
  • 覆盖内置原型:在生产环境中直接修改原生对象原型可能引发冲突。建议将此方法封装在一个模块或工具类中,例如 Utils.String.format(),以避免污染全局作用域。

以上就是JavaScript模拟C#格式化字符串的详细内容,更多关于JavaScript字符串处理技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。