Nhiều hàm trên (trừ Julian Jelfs) có lỗi sau:
js> '{0} {0} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 3.14 afoobc foo
Hoặc, đối với các biến thể đếm ngược từ cuối danh sách đối số:
js> '{0} {0} {1} {2}'.format(3.14, 'a{0}bc', 'foo');
3.14 3.14 a3.14bc foo
Đây là một chức năng chính xác. Đó là một biến thể nguyên mẫu của mã Julian Jelfs, mà tôi đã làm chặt chẽ hơn một chút:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{(\d+)\}/g, function (m, n) { return args[n]; });
};
Và đây là một phiên bản cao cấp hơn một chút, cho phép bạn thoát khỏi niềng răng bằng cách nhân đôi chúng:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
if (m == "{{") { return "{"; }
if (m == "}}") { return "}"; }
return args[n];
});
};
Điều này hoạt động chính xác:
js> '{0} {{0}} {{{0}}} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 {0} {3.14} a{2}bc foo
Đây là một triển khai tốt khác của Blair Mitchelmore, với một loạt các tính năng bổ sung thú vị: https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/opes.format