Проблема с приведением типов [дубликат]

218
27 сентября 2018, 00:40

Данный вопрос уже был задан и имеет решение:

  • Калькулятор javascript которы из строки с выражением вычисляет результат 2 ответа

Пусть a это string и равняется "5 + 5". Тогда при вызове мне вернут "5 + 5". Но мне нужно получить результат вычисления (то есть не "5 + 5" а 10).

var a = "5 + 5";
var b = new Number (5 + 5); // b будет равно 10
var b = new Number (a); // b будет равно NaN

Каким образом я могу получить результат арифметической операций из строки?

Answer 1

Я бы не советовал использовать eval(), т.к. он не является безопасным методом. Подробнее можете прочитать тут, кроме того там же приведен пример парсера математических формул.

Answer 2

Выше уже писали, что eval ( читай evil ) не очень подходит из-за безопасности, и уж лучше взять какой-нить парсер формул.

Но для полноты картины, вот еще один способ

function calcString(str) {
  return (new Function(`return ${str}`))()
}
calcString('5+5');

new Function принимает строку, которая описывает тело. Но опять же, можно передать любую строчку, которая вызовется сразу же, что в перспективе не очень безопасно

Вообще, если у вас уж очень простые формулы, вида a операция b, то можно очень просто парсить

function calcString(str) {
  const [a, opr, b] = str.replace(/\s/g, '').split('');
  const oprs = {
    '+': (a, b) => a + b,
    '-': (a,b) => a - b,
    '*': (a,b) => a * b,
    '/': (a,b) => a / b
  }
  if(!(opr in oprs)) {
    throw new Error('wrong operation');
  }
  return oprs[opr](parseFloat(a), parseFloat(b));
}
calcString('5 + 5');

Но тут очень много условностей, если нужно что-то сложнее, тогда лучше искать готовое решение

Answer 3

вот библиотека math.js

 var a = '5+5'
 math.eval('5+5') // => 10
 math.eval(a) // => 10 

Можно поизучать, код на Github, на предмет реализации собственной функции/парсера. Я понимаю, сложно, но это отличный пример.

READ ALSO
vue.js <img src>

vue.js <img src>

Изучаю компоненты vuejs (вместе с Laravel) и наткнулся на проблему: не отрисовывается картинка

225
Как оформлять библиотеки?

Как оформлять библиотеки?

Создал небольшой скрипт, хочу использовать его как библиотекуСкрипт состоит из функции которая используется в конструкторе объектов (то есть...

252
Как сделать десятиугольник в Three.js?

Как сделать десятиугольник в Three.js?

Этот код описывает круглую сферу threejs

224