#javascript
#javascript
Вопрос:
Я хотел знать, является ли это чистой функцией javascript. если это не так, я хотел бы понять причину.
function reverseArrayInPlace(array1) {
let array2 = [];
for (let i = array1.length - 1; i >= 0; i--) {
array2.push(array1[i]);
}
return array2;
}
Спасибо за помощь!
Комментарии:
1. Это так. Я даже не уверен, почему вы спрашиваете. Если вы знаете, что такое чистая функция, это должно быть довольно ясно — никакие внешние данные не используются, и функция будет предсказуемо выдавать одни и те же данные каждый раз, когда вы вызываете ее с одним и тем же вводом.
2. Имя функции вводит в заблуждение.
reverseArrayInPlace
?3. @BenCoupe это определение чистых функций совершенно неверно.
4. @BenCoupe нет, это правильный термин .
5. @FrancescoCasella в упражнении не указано использовать чистую функцию. И действительно, невозможно использовать чистую функцию
reverseArrayInPlace
, потому что она должна изменять свой ввод, а это нечисто. Что касается того, чтоreverseArrayInPlace
делает — он меняет местами первый и последний элемент, затем второй и предпоследний и т. Д., Пока Не достигнет середины. Вы показываете реализацию дляreverseArray
.
Ответ №1:
Поскольку чистая функция должна выдавать один и тот же результат при одном и том же вводе, без побочных эффектов, ваш код является чистым (при условии, что array1
параметр будет простым массивом, а не чем-то странным, например, объектом с параметром setter в его length
свойстве).
Тем не менее, чистота, как правило, является проблемой, о которой следует беспокоиться в функциональных контекстах, и это не функциональный подход, поскольку вы используете .push
, который изменяет созданный вами массив. Более функциональным подходом было бы использовать .map
для создания массива, который будет возвращен за один раз, без мутации:
const reverseArray = (arr) => {
const { length } = arr;
return arr.map((_, i) => arr[length - 1]);
};
или Array.from
:
const reverseArray = (arr) => {
const { length } = arr;
return Array.from(
arr,
(_, i) => arr[length - 1]
);
};
Также обратите внимание, что все эти реализации возвращают новый массив, но они не меняют массив на место. (Любая функция, которая перевернула массив на месте, была бы нечистой, потому что это было бы побочным эффектом.) Лучше всего либо выбрать другое имя, чем reverseArrayInPlace
, или, если вы хотите изменить массив на месте, отказаться от чистоты, поскольку это было бы невозможно.
Комментарии:
1. спасибо за ваш четкий и подробный ответ! название функции взято из упражнения книги eloquent javascript, в котором предлагается создать чистую функцию для преобразования массива, только я не понимаю решения, которое принимает книга, оно кажется более сложным, чем мое. если вы хотите ознакомиться с упражнением из книги, вы можете найти его здесь: eloquentjavascript.net/code/#4.2
2. Он просит вас написать две функции — одну нечистую, чтобы заменить массив на месте, и ту, которая возвращает новый массив (который может быть чистым).