JavaScript: обход дерева объектов

Допустим корневой объект который нужно обойти задан так:
[cc lang=’javascript’ ]
var myobj =
{
“city”: “spb”,
“user”: {
“name”: “misha”,
“age”: 30,
“props”: {
“enabled”: 1,
“guest”: 1
}
},
“browser”: “lynx”
};
[/cc]

В моём случае потребовалось пройтись по всему дереву и вывести на страницу его в удобочитаемом виде. Исходное дерево получаю из php с помощью функции json_encode.

[cc lang=”javascript”]
function recurse_tree(item) {
for(c in item) {
if (item[c] instanceof Object) {
// here: node is object
recurse_tree(item[c]);
continue;
}
// here: node isn’t object
document.writeln(c + ‘ = ‘ + item[c]);
}
}
recurse_tree(myobj);
[/cc]
Казалось бы всё просто и очевидно. Меня сильно смутило как проверить что очередной нод – это объект по которому нужно также пройтись – пришлось перепробовать довольно много вариантов. Как видно пришлось остановиться на проверке на то, что нод является экземпляром класса Object :)

Ещё надо быть очень аккуратным – если есть ссылки внутри объекта на себя же, то вышеприведённая функция загрузит браузер, после чего выполнение js остановят.