util: show symbol properties

Properties with symbol names are shown if option `showHidden` of `util.inspect`
or `console.dir` is `true`.

PR-URL: https://github.com/iojs/io.js/pull/247
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Rod Vagg <rod@vagg.org>
This commit is contained in:
Vladimir Kurchatkin 2015-01-08 00:54:25 +03:00 committed by Ben Noordhuis
parent 604b876147
commit c70d192ab3
4 changed files with 26 additions and 6 deletions

View File

@ -52,8 +52,8 @@ Uses `util.inspect` on `obj` and prints resulting string to stdout. This functio
bypasses any custom `inspect()` function on `obj`. An optional *options* object bypasses any custom `inspect()` function on `obj`. An optional *options* object
may be passed that alters certain aspects of the formatted string: may be passed that alters certain aspects of the formatted string:
- `showHidden` - if `true` then the object's non-enumerable properties will be - `showHidden` - if `true` then the object's non-enumerable and symbol
shown too. Defaults to `false`. properties will be shown too. Defaults to `false`.
- `depth` - tells `inspect` how many times to recurse while formatting the - `depth` - tells `inspect` how many times to recurse while formatting the
object. This is useful for inspecting large complicated objects. Defaults to object. This is useful for inspecting large complicated objects. Defaults to

View File

@ -88,8 +88,8 @@ Return a string representation of `object`, which is useful for debugging.
An optional *options* object may be passed that alters certain aspects of the An optional *options* object may be passed that alters certain aspects of the
formatted string: formatted string:
- `showHidden` - if `true` then the object's non-enumerable properties will be - `showHidden` - if `true` then the object's non-enumerable and symbol
shown too. Defaults to `false`. properties will be shown too. Defaults to `false`.
- `depth` - tells `inspect` how many times to recurse while formatting the - `depth` - tells `inspect` how many times to recurse while formatting the
object. This is useful for inspecting large complicated objects. Defaults to object. This is useful for inspecting large complicated objects. Defaults to

View File

@ -240,6 +240,7 @@ function formatValue(ctx, value, recurseTimes) {
if (ctx.showHidden) { if (ctx.showHidden) {
keys = Object.getOwnPropertyNames(value); keys = Object.getOwnPropertyNames(value);
keys = keys.concat(Object.getOwnPropertySymbols(value));
} }
// This could be a boxed primitive (new String(), etc.), check valueOf() // This could be a boxed primitive (new String(), etc.), check valueOf()
@ -422,7 +423,7 @@ function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
} }
} }
keys.forEach(function(key) { keys.forEach(function(key) {
if (!key.match(/^\d+$/)) { if (isSymbol(key) || !key.match(/^\d+$/)) {
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
key, true)); key, true));
} }
@ -446,7 +447,11 @@ function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
} }
} }
if (!hasOwnProperty(visibleKeys, key)) { if (!hasOwnProperty(visibleKeys, key)) {
name = '[' + key + ']'; if (isSymbol(key)) {
name = '[' + ctx.stylize(key.toString(), 'symbol') + ']';
} else {
name = '[' + key + ']';
}
} }
if (!str) { if (!str) {
if (ctx.seen.indexOf(desc.value) < 0) { if (ctx.seen.indexOf(desc.value) < 0) {

View File

@ -243,4 +243,19 @@ if (typeof Symbol !== 'undefined') {
assert.equal(util.inspect(Symbol('hi')), 'Symbol(hi)'); assert.equal(util.inspect(Symbol('hi')), 'Symbol(hi)');
assert.equal(util.inspect([Symbol()]), '[ Symbol() ]'); assert.equal(util.inspect([Symbol()]), '[ Symbol() ]');
assert.equal(util.inspect({ foo: Symbol() }), '{ foo: Symbol() }'); assert.equal(util.inspect({ foo: Symbol() }), '{ foo: Symbol() }');
var options = { showHidden: true };
var subject = {};
subject[Symbol('symbol')] = 42;
assert.equal(util.inspect(subject), '{}');
assert.equal(util.inspect(subject, options), '{ [Symbol(symbol)]: 42 }');
subject = [1, 2, 3];
subject[Symbol('symbol')] = 42;
assert.equal(util.inspect(subject), '[ 1, 2, 3 ]');
assert.equal(util.inspect(subject, options), '[ 1, 2, 3, [length]: 3, [Symbol(symbol)]: 42 ]');
} }