Comments 13
UFO just landed and posted this here
Первое что пришло в голову: нечисловые поля массива потеряются.
0
Второе что пришло в голову: рекурсивные объекты
+3
Попробовал запустить:
deepClone({
firstName: "John",
lastName : "Doe",
id : 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
});
Упало c «InternalError: too much recursion»+3
Хочется узнать, что имеет ввиду автор под фп
0
Постоянное копирование довольно труднозатратная операция (особенно в JS и особенно в ФП-стиле). Как насчет того чтобы задействовать copy-on-write?
0
Боже, какой паттерн матчинг )))function deepClone(source) { return ({ 'object': cloneObject, 'function': cloneFunction }[typeof source] || clonePrimitive)(source)(); }
+2
Но так как, к сожалению, многие до сих пор не могут перестроить свое мышление с процедурщины и псевдо-ООП, я объясню...
Код, в первую очередь, должен выполнять свою функцию. А во вторую — он должен быть понятным. Хороший код не нужно объяснять, и это не зависит от привычек мышления.
в зависимости от типа данных в 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();
}
+1
Как минимум было бы неплохи иметь какую-никакую типизированную документацию к таким функциям, например в стиле jsdoc. И не делать такие высоконагржуенные конвеерные функции, только для понимания добавить временные поясняющие равенства внутри.
Тфакже можно отказаться от ключевого function и arguments в пользу стрелочной (...args) =>
Тфакже можно отказаться от ключевого function и arguments в пользу стрелочной (...args) =>
0
Sign up to leave a comment.
Переосмысление deepClone