А что проще и быстрее в изучение gecko или servo?@PrytexY, тут как посмотреть, с одной стороны, как сказал Flying - Gecko это реальный движок Firefox
Ну поддержку распиаренного проекта как минимум не прекратят в одночасье, в отличие от ноунейм пакетов.
1. Вместо конструкции можно использовать Object.getOwnPropertyNames и итерироваться по полученному массиву, это будет несколько быстрее.
2. Вижу, что Вы использовали поле isActive для того, что бы не войти в бесконечную рекурсию, в случае рекурсивных ссылок, но тут есть несколько нюансов:
Во-первых, есть ли гарантия, что такое поле точно не появится в объекте, к которому будет применяться Ваша функция?
Во-вторых, в самом начале Вы при проверке данного поля возвращаете оригинальный объект а не клонированный, что некорректно.
Я бы предложил использовать для хранения клонированных объектов Map, но если нужна поддержка IE или других динозавров, то не забудьте подключить полифил.
3. Массивы лучше клонировать методом map
4. Вызывать конструктор объекта вот так
obj.constructor();
некорректно, мало того, что он отработал на исходном объекте, а не на новом, Ваш код попросту упадет с ошибкой почти на всем, кроме plain object, так как конструкторы обычно ничего не возвращают. Вместо этого стоит использовать Object.getPrototypeOf и Object.setPrototypeOf.5. У Вас не учтены функции, хотя возможно Вам это и не надо, хотя следует помнить, что функции вполне себе могут содержать поля подобно объектам, но при этом оператор typeof для них возвращает 'function'.
Пожалуй сделаю свое решение в ответе