Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Первое что пришло в голову: нечисловые поля массива потеряются.
Второе что пришло в голову: рекурсивные объекты
deepClone({
firstName: "John",
lastName : "Doe",
id : 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
});Упало c «InternalError: too much recursion»Боже, какой паттерн матчинг )))function deepClone(source) { return ({ 'object': cloneObject, 'function': cloneFunction }[typeof source] || clonePrimitive)(source)(); }
Но так как, к сожалению, многие до сих пор не могут перестроить свое мышление с процедурщины и псевдо-ООП, я объясню...
Код, в первую очередь, должен выполнять свою функцию. А во вторую — он должен быть понятным. Хороший код не нужно объяснять, и это не зависит от привычек мышления.
в зависимости от типа данных в source выбирается функция которая умеет его клонировать, и в нее передается сам source.
Так же можно заметить, что возвращаемый результат вызывается как функция без параметров, прежде чем быть возвращенным пользователю. Это необходимо, так как я оборачиваю значение, в которое клонирую, в простейший функтор,
Думаю, что это же самое можно было написать и на JavaScript, например так:
function deepClone(source) {
const type = typeof source;
let fnClone = (type === 'object') ? cloneObject
: (type === 'function') ? cloneFunction
: clonePrimitive;
const fnWrap = fnClone(source);
return fnWrap();
}
Переосмысление deepClone