получение строкового представления данных из функции js каррирование
У меня есть исправленная с вашей помощью функция для каррирования!
function curry(func) {
let args = [], isFlagToReset = false;
let selfRetFunc = function(...str) {
if (isFlagToReset) {
isFlagToReset = false;
args = [];
}
args.push(str);
return selfRetFunc;
}
let getResult = function(isOrdinaryCall = false) {
if (isOrdinaryCall) return Function.prototype.toString.call(selfRetFunc);
isFlagToReset = true;
return func(args);
}
selfRetFunc.valueOf = getResult;
selfRetFunc.toString = getResult;
return selfRetFunc;
}
function concatSpec(strs) {
let separator = "", result = "";
for (let str of strs) {
if (str[0] && typeof str[0] !== "string") return result;
if (str[0]) result += str[0];
if (str[1]) separator = str[1];
result += separator;
}
return result;
}
let con = curry(concatSpec);
console.log(con("one"));
console.log(con("one")("two"));
console.log(con("one")("two")("three"));
Мой вопрос заключается в следующем. В интерпретаторе stackoverflow все работает правильно. Но при попытке загрузки данного кода в JSFiddle или использовании его локально на компе, вместо строки 'onetwothree', я получаю функцию.
https://jsfiddle.net/Natella/fvp1h29m/191/
в консоли сайта(та, которая представлена на сайте вместе с блоками для работы кода) все работает верно, но в браузерной(та, в которую заходим нажав F12)-нет.
хотела бы узнать, может кто-то может подсказать, как изменить данный код таким образом, что бы мне не приходилось писать вот такой костыль:
console.log(''+con("one")("two"));
Ответы (1 шт):
Для случая, когда неизвестно в какой момент должно вернуться значение - ничего сделать нельзя.
Консоль браузера сама определяет как показать выводимый объект. В данном случае консоль хрома выводит сам переданный объект, а не результат вызова valueOf или toString.
Для решения можно либо добавить проверку, что функция вызывается без параметром = и в этом случае возвращать результат, а не функцию. Однако этот вариант ничем не отличается от приведения к строке.
Либо, переписать функцию curry таким образом, чтобы было явно задано количество ожидаемых параметров. Но в этом случае, невозможно будет получить значение в любой момент.