diff --git a/lib/util.js b/lib/util.js index a21881b8173..84833d38c43 100644 --- a/lib/util.js +++ b/lib/util.js @@ -211,7 +211,7 @@ function formatValue(ctx, value, recurseTimes) { base = ' ' + value.toUTCString(); } - if (keys.length === 0) { + if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } @@ -225,9 +225,14 @@ function formatValue(ctx, value, recurseTimes) { ctx.seen.push(value); - var output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } ctx.seen.pop(); @@ -259,6 +264,26 @@ function formatPrimitive(ctx, value) { } +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (Object.prototype.hasOwnProperty.call(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str; if (value.__lookupGetter__) { diff --git a/test/simple/test-util-inspect.js b/test/simple/test-util-inspect.js index 717182f88de..36884e27c25 100644 --- a/test/simple/test-util-inspect.js +++ b/test/simple/test-util-inspect.js @@ -33,3 +33,11 @@ var orig = util.inspect(d); Date2.prototype.foo = 'bar'; var after = util.inspect(d); assert.equal(orig, after); + +// test for sparse array +var a = [ 'foo', 'bar', 'baz' ]; +assert.equal(util.inspect(a), "[ 'foo', 'bar', 'baz' ]"); +delete a[1]; +assert.equal(util.inspect(a), "[ 'foo', , 'baz' ]"); +assert.equal(util.inspect(a, true), "[ 'foo', , 'baz', [length]: 3 ]"); +assert.equal(util.inspect(new Array(5)), '[ , , , , ]');