一、背景

在C#中,String类有一个Format()方法,可以方便使用字符串模板和动态参数来构建最终的字符串。

比如有如下代码:

Console.WriteLine(String.Format("Current Page Index: {0}, Total Pages: {1}", 10, 150));

最终输出为:

Current Page Index: 10, Total Pages: 150

但是,JavaScript 的String对象没有这样的字符串模板方法。不过,我们可以自行给它的String对象添加一个。来模仿C#中的String.Format()。

二、解决方案

代码:

    String.format = function () {
        if (arguments.length <= 0) {
            return "";
        } else {
            var string = arguments[0];
            for (var i = 1; i < arguments.length; i++) {
                string = string.replace("{" + (i - 1) + "}", arguments[i]);
            }
        return string;
    }
};</pre>

三、应用示例

这样写代码:

    alert(String.format("Current Page Index: {0}, Total Pages: {1}", 10, 150));

运行结果: 点击这里运行

image

四、原理剖析

  1. 在 JavaScript 中,可以修改已有对象,或者为已有对象添加新方法。
    • 本例中就是为已有对象String添加了format()新方法。
  2. 由于需要传递给String.format()方法的参数不确定,故需要用到arguments对象。
    • 在函数代码中,使用特殊对象arguments,开发者无需明确指出参数名,就能访问它们。第一个参数位于位置0,第二个参数位于位置1,依次类推。
    • 与其他程序设计语言不同,Javascript不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据Netscape的文档,最多能接受25个),而不会引发任何错误,任何遗漏的参数都会以undefined传递给函数,多余的参数将忽略。
    • 因此本例中在函数定义处根本没有定义参数。

[donate: www.zizhujy.com]