Преобразовать строку с подчеркиванием в число одним вызовом функции в Chrome - PullRequest
0 голосов
/ 27 октября 2019

У меня есть интересное задание для собеседования.

Строка с числами и подчеркиванием должна быть преобразована в число с помощью всего одного вызова собственной функции. Этот код будет работать только в Chrome.

someFunc('1_22_333') = 122333;

Кто-нибудь знает, что это за функция? Может быть, это одна из новых функций?

Ответы [ 2 ]

1 голос
/ 27 октября 2019

только с одним собственным вызовом функции

Акцент мой. Если это точное требование, вы можете попытаться обойти правила. Ответ от kshetline уже показывает, что вы можете использовать eval, но если бы я давал интервью, я бы очень хотел, чтобы люди не использовали eval. Поэтому для меня требование вызова функции one можно выполнить с помощью replace:

function someFunc(arg) {
  return +arg.replace(/_/g, "")
}

console.log(someFunc('1_22_333'))

Итак, это один вызов String#replace и унарный плюс operator .

Однако это несколько эксплуатирует технические детали:

  • Вопрос никогда не определяет , а не для использования операторов, он просто говорит о вызове одной функции. Поскольку требование явно не запрещает нефункциональные операции, оператор не находится вне правил.
  • .replace также является методом не функцией, так как это свойствоСтроковый объект. Тем не менее, это немного больше философского различия - вы, безусловно, можете отметить, что у JS очень слабое различие между методами и функциями. Все методы - это просто функции , которые присоединены к объекту и (обычно, но не всегда) используют контекст this.

Если эта вторая точка оспаривается, то не стесняйтесьизменить правила еще сложнее - если метод его не обрезает, то метод не должен учитываться как часть требования для одного вызова функции . Точно так же оператор + не считается. Таким образом, в этом случае этот код должен соответствовать требованию:

function someFunc(arg) {
  var method = String.prototype.replace;
  var fn = method.bind(arg);
  return +fn(/_/g, "");
}

console.log(someFunc('1_22_333'))
Я разбил его для упрощения рассуждений. Вы также можете просто написать +String.prototype.replace.bind(arg)(/_/g, "")
  • String.prototype.replace - это не вызов функции, это получение значения объекта. В данном случае это прототип String, но это не имеет значения.
  • Function#bind - это вызов метода . Если это не считается как функция, то это разрешено. Это вернет новую функцию , которую вы можете выполнить. Если кто-то жаловался, что технически .replace является методом, то технически , результат возврата .bind определенно не является.

Это творческий подходинтерпретация по многим пунктам, но я все еще нахожу это лучшим ответом , чем eval.

1 голос
/ 27 октября 2019

Может быть, вопрос с подвохом? Chrome преобразует 1_22_333 в 122333 без применения какой-либо функции вообще, поскольку ES6 по умолчанию поддерживает подчеркивания в числах.

Если это строка, однако, Number(), parseInt() и parseFloat() либо завершаются неудачно сNaN или просто дать вам 1, останавливаясь на первом подчеркивании.

Однако есть одна функция, которая справится с задачей: страшная eval().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...