diff --git a/doc/api/util.markdown b/doc/api/util.markdown index 65e1f7c63e..bf18075dec 100644 --- a/doc/api/util.markdown +++ b/doc/api/util.markdown @@ -17,9 +17,10 @@ argument. Supported placeholders are: * `%j` - JSON. * `%%` - single percent sign (`'%'`). This does not consume an argument. -If the placeholder does not have a corresponding argument, `undefined` is used. +If the placeholder does not have a corresponding argument, the placeholder is +not replaced. - util.format('%s:%s', 'foo'); // 'foo:undefined' + util.format('%s:%s', 'foo'); // 'foo:%s' If there are more arguments than placeholders, the extra arguments are converted to strings with `util.inspect()` and these strings are concatenated, diff --git a/lib/util.js b/lib/util.js index d4e6bbf5cc..039d0fa028 100644 --- a/lib/util.js +++ b/lib/util.js @@ -34,7 +34,9 @@ exports.format = function(f) { var i = 1; var args = arguments; + var len = args.length; var str = String(f).replace(formatRegExp, function(x) { + if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); @@ -44,7 +46,7 @@ exports.format = function(f) { return x; } }); - for (var len = args.length, x = args[i]; i < len; x = args[++i]) { + for (var x = args[i]; i < len; x = args[++i]) { if (x === null || typeof x !== 'object') { str += ' ' + x; } else { diff --git a/test/simple/test-util-format.js b/test/simple/test-util-format.js index 6a497089b1..e9c28c2de5 100644 --- a/test/simple/test-util-format.js +++ b/test/simple/test-util-format.js @@ -47,3 +47,12 @@ assert.equal(util.format('%j', '42'), '"42"'); assert.equal(util.format('%%s%s', 'foo'), '%sfoo'); +assert.equal(util.format('%s'), '%s'); +assert.equal(util.format('%s', undefined), 'undefined'); +assert.equal(util.format('%s', 'foo'), 'foo'); +assert.equal(util.format('%s:%s'), '%s:%s'); +assert.equal(util.format('%s:%s', undefined), 'undefined:%s'); +assert.equal(util.format('%s:%s', 'foo'), 'foo:%s'); +assert.equal(util.format('%s:%s', 'foo', 'bar'), 'foo:bar'); +assert.equal(util.format('%s:%s', 'foo', 'bar', 'baz'), 'foo:bar baz'); +