Browse Source

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>
v1.8.0-commit
Vladimir Kurchatkin 10 years ago
committed by Ben Noordhuis
parent
commit
c70d192ab3
  1. 4
      doc/api/console.markdown
  2. 4
      doc/api/util.markdown
  3. 9
      lib/util.js
  4. 15
      test/parallel/test-util-inspect.js

4
doc/api/console.markdown

@ -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

4
doc/api/util.markdown

@ -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

9
lib/util.js

@ -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) {

15
test/parallel/test-util-inspect.js

@ -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 ]');
} }

Loading…
Cancel
Save