Object.prototype.inspect ?

Brendan Eich brendan at mozilla.com
Sun Mar 15 15:30:54 PDT 2009


On Mar 15, 2009, at 10:13 AM, Tobie Langel wrote:

> Added Ruby and Python debug string rendering of methods.
>
> Ruby: http://gist.github.com/78355
>
> Python: http://gist.github.com/78424
>
> Please let me know if you would like those resources included in the  
> mailing list of if external references are fine.

Links work for me. But here is the uneval/toSource equivalent, inline,  
using the same notation (single quotes around string results, although  
all results are string results, in a one-line comment starting //->  
after the repr call):

function repr(v) {
    print(uneval(v))
}

repr(false)
//-> 'false'

repr(true)
//-> 'true'

repr(null)
//-> 'null'

repr(undefined)
//-> '(void 0)'

repr('foo')
//-> '"foo"'

repr(123)
//-> '123'

repr(123.4)
//-> '123.4'

r = new RegExp('foo')
repr(r)
//-> '/foo/'

repr(new Date)
//-> '(new Date(1237141453430))'

repr([0, 1, [2, 3]])
//-> '[0, 1, [2, 3]]'

repr({foo: 123})
//-> '({foo:123})'

a = [1, 2, 3]
a.push(a)
repr(a)
//-> '#1=[1, 2, 3, #1#]'

h = {foo: 123}
h.bar = h
repr(h)
//-> '#1={foo:123, bar:#1#}'

function Foo() {
  var self = {}
  self.__init__ = function () {
    self.foo = 123
    self.bar = 456
  }
  return self
}
repr(Foo())
//-> '({__init__:(function () {self.foo = 123;self.bar = 456;})})'

repr(Foo)
//-> 'function Foo() {var self = {};self.__init__ = function ()  
{self.foo = 123;self.bar = 456;};return self;}'

repr([].reverse)
//-> 'function reverse() {[native code]}'

Since undefined was added as a global property after ES1, when there  
was too much risk of a web page defining a same-named global, it's  
read/write and deletable, so uneval(undefined) produces '(void 0)'.

Note also that unlike toString, the function toSource results squish  
code onto one line. This can get ugly, but it was considered  
convenient for short functions. Perhaps it was a mistake to do this,  
though.

Sharp variables handle cycles and join points but they are overkill  
for an inspect-like utility, and they require aggressive memoization  
to avoid divergence calling non-idempotent getters or otherwise  
dealing with object graphs that modify themselves (via SpiderMonkey's  
internal metaprogramming hooks) as they are crawled to find the join  
points.

Comments welcome.

/be


More information about the Es-discuss mailing list