一直以来JavaScript对字符串的操作比较弱,特别是做.NET的人很清楚,犹如:String.Form格式化、StringBuilder大量字符串拼接每天都是离不开。故而也会在JavaScript上模拟这些。

String.Format

其实说白一点即是字符替换,这也是模板引擎最初级做法。而这里我提供一个我多年的示例:

/**
 * demo {@code 'this is the {0}'.format('end'); }
 */
String.prototype.format = function () {
    var args = arguments;
    return this.replace(/\{(\d+)\}/g, function (m, i) {
        return args[i];
    });
};

非常简单,但很耐用且是不是比.NET更优雅呢?当然这也只能{0}…{∞}来替换字符串,并无任何实际的运算能力或格式化能力。

且因为我们还会遇到另一种问题,就是当{}过多的时候,维护变得很困难。所以我们需要另一个高级点的办法。

String.Form变体

先看示例:

String.prototype.format = function () {
    var args = arguments;
    if (args.length == 1 && typeof(args[0]) === 'object') {
        return this.replace(/\{([\w\d]+)\}/g, function (m, i) {
            return args[0][i];
        });
    } else {
        return this.replace(/\{(\d+)\}/g, function (m, i) {
            return args[i];
        });
    }
};

相比较只是将{0}变成{Variable}一个比较有意义的变量名。这两种调用方法如下:

alert('ID:{0},UserName:{1}'.format('1', 'cipchk'));
alert('ID:{ID},UserName:{UserName}'.format({ ID: 1, UserName: 'cipchk' }));

以上倒是可以非常简单的完成字符串替换工作,接下来我们还需要一个很重要的东西,字符串拼接:

StringBuilder

.net为何会提出StringBuilder就是由于字符串+=会倒置内存空间的重新定义。Javascript的String跟.NET是相同问题,所以经常会听到在JavaScript里面使用Array和Array.Join来代替传统的+=,毋庸置疑网上有非常多评测来验证这个问题。

其实不然,+=速度慢那只是针对于传统浏览器比如:IE8以