Я поигрался с некоторыми функциями и заметил, что эти две функции, похоже, имеют разные выходы в чистой функции. Правильно ли я считаю, что эти два выхода разные?

counter = 0;
function createObject1(name, calories, fat, carbs, protein) {
    counter += 1;
    return { id: counter, name, calories, fat, carbs, protein };
}

function createObject2(...args) {
    counter += 1;
    var data = {};
    data['id'] = counter;
    var headers = args[args.length - 1];
    for (var i = 0; i < args.length-1; i++) {
        data[headers[i]] = args[i]
    }
    return data   
}

// How I'm calling them
createObject1('Cupcake', 305, 3.7, 67, 4.3);
createObject2('Cupcake', 305, 3.7, 67, 4.3, ["name","calories","fat","carbs","protein"]);

Спасибо за вашу помощь! :-)

1
Tim 14 Сен 2018 в 02:16

2 ответа

Лучший ответ

Что ж, попробуем:

counter = 0;
function createObject1(name, calories, fat, carbs, protein) {
    counter += 1;
    return { id: counter, name, calories, fat, carbs, protein };
}

function createObject2(...args) {
    counter += 1;
    var data = {};
    data['id'] = counter;
    var headers = args[args.length - 1];
    for (var i = 0; i < args.length-1; i++) {
        data[headers[i]] = args[i]
    }
    return data   
}

console.log(JSON.stringify(createObject1('Cupcake', 305, 3.7, 67, 4.3)));
console.log(JSON.stringify(createObject2('Cupcake', 305, 3.7, 67, 4.3, ["name","calories","fat","carbs","protein"])));

Выход:

{"id":1,"name":"Cupcake","calories":305,"fat":3.7,"carbs":67,"protein":4.3}
{"id":2,"name":"Cupcake","calories":305,"fat":3.7,"carbs":67,"protein":4.3}

Если под чистой функцией вы имеете в виду концепцию, используемую в функциональном программировании (функция, которая всегда возвращает один и тот же вывод для данного ввода), то эти функции не являются чистыми. Чистая функция должна зависеть только от своих параметров в качестве входных, поэтому глобальная переменная counter нарушает это правило.

2
Gus 14 Сен 2018 в 02:14

Я думаю, вам не хватает чистых функций.

Функция является чистой только в том случае, если при одном и том же вводе она всегда будет производить одинаковый вывод.

Ваши функции createObject1 и createObject2 выполняют одну и ту же работу по-разному и, как ожидается, дадут одинаковые результаты при одинаковом вводе. Поэтому нельзя сказать, что функции различаются в зависимости от их функциональности.

Но поскольку эти функции не являются чистыми функциями, потому что они имеют состояние counter, которое поддерживается глобально.

Следовательно, для одних и тех же входов вы никогда не сможете получить здесь одинаковые выходы, поскольку ваш выход зависит от когда-либо меняющегося глобального состояния counter

Я надеюсь, что это помогает.

1
The Observer Man 14 Сен 2018 в 01:28