Рекурсия объекта [как сделать полную копию объекта?]

var initialObj = {
    object: {
       string2: 'Petrov',
       object2: {
           array2: [{}, {}]
       },
       object3: {}
    },
};
var obj = {};

function deepClone(initialObj) {
      for (var key in initialObj.object[key]) {
      obj.object[key] = initialObj.object[key];
  }
    return initialObj;
}
    obj = initialObj;

      var clonedObj = deepClone(initialObj);

      clonedObj.object.object2.array2[1].name = 'Vasya';
      console.log(initialObj);
      console.log(clonedObj);

Скопирывалитсь 2 объекта, только при изминениии имени, меняется в обоих. Походу скопирывалась ссылка. Как склонирывать? Что бы они были как два независимых объекта. Заранее благодарен за любую помощь.

Самый дешевый и простой способ

function cloneObj(obj) {
	return JSON.parse(JSON.stringify(obj))
}

У него есть проблемы (например выкинетеся ошибка если в значениях свойст объекта есть функция).

Для решений где все равно какой вложенности объект, имеет значение производительность и значения могут быть любыми бери готовые библиотеки-пакеты: https://www.npmjs.com/package/clone

Есть ли ещё методы без JSON? Дело в том что мне тот вариант не подходит, т.к. мы это ещё не проходили (

Если смотреть на задачу как на упражнение, то тебе нужна рекурсивная функция, которая будет делать копии массивов-объектов, вызывя себя для значения массивов-объектов, а примитивные значения возвращать как есть. Ниже набросок решения.
isPromitive, isArray, isObject я не реализовывал. В наброске решения куча крайних случаев, но для понимания концепта этого достаточно.

function deepClone(obj) {
	if(isPromitive(obj)) {
		return obj
	} else if (isArray(obj)) {
		return obj.map((val) => {
			return deepClone(val)
		})
	} else if (isObject(obj)) {
		let res = {}
		for (let k in obj) {
			res[k] = deepClone(obj[k])
		}
		return res
	}
}

Если смотреть на задачу НЕ как на упражнение) то ES6 вам в помощь. Проще всего

var obj = { a: 1 };
var copy = Object.assign({}, obj);

У этого решения проблема такая же как и у топикастера:

const obj1 = {
    object: {
       string2: 'Petrov'
   }
}
const obj2 = Object.assign({}, obj1)
obj1.object.name = 'Sidorov'
console.log(obj2.object.name) // expected Petrov, got Sidorov