У меня есть строковое выражение, подобное этому 10/3*4-7
, и я хочу знать, существует ли какой-то тип javascript-метода, который может преобразовать строку в фактическое выражение, чтобы я мог получить ответ . У меня есть функция, которая случайным образом генерирует числа и операторы, и я хочу получить результат из уравнения. Тем не менее, функция, которую я создал для получения результата, вычисляет только слева направо. Это не соответствует приоритету оператора, где * и/вычисляются сначала и тому подобное. Есть ли что-то в javascript, который может это сделать, или мне нужно создать функцию, чтобы сделать что-то подобное?Как преобразовать строковое выражение math в фактическое математическое выражение
ответ
Я бы рекомендовал использовать библиотеку, такие как Math.js как это будет разобрать математическое выражение, используя регулярные выражения. Это позволит избежать открытия приложения до атак типа Cross-Site scripting (XSS).
var answer = math.eval('10/3*4-7');
console.log(answer);
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.6.0/math.min.js"></script>
Спасибо и всем остальным, которые пытались мне помочь –
минорная вещь здесь: под обложками math.js использует 'Function()'. Большая вещь, которую вы получаете от его использования, заключается в том, что ваше выражение будет сначала проанализировано и должно быть правильным. – Tibrogargan
@Tibrogargan - Я не могу найти его в исходном коде. Хотите опубликовать ссылку? –
Существует довольно дискуссия here о том, почему вы не должны использовать eval()
, если нет ясных альтернатив. Использование eval()
в данном случае совершенно не нужно, как показано в примере ниже:
var expression = "10/3*4-7";
var foo = Function('"use strict"; return '+expression);
console.log(foo());
я не знаю, о«всех broswers», но этот механизм был в JavaScript не менее 19 лет (с ECMA 1.0). Я был бы удивлен, если бы были обычные браузеры, которые не поддерживали его. – Tibrogargan
Функция JS стандартная и поддерживается во всех браузерах. Однако это небезопасно буквально по той же причине, что и eval. Для этого нет никакой пользы. –
@Iwrestledabearonce с использованием eval() отключит оптимизацию компилятора. – Tibrogargan
Эта функция принимает либо строковое выражение, или массив символов, которые создают выражение.
function calculate(expression) {
"strict mode";
\t if(Array.isArray(expression))
\t \t expression = expression.join("");
var allowedChars = "1234567890%^*()-+/. ";
for (var i = 0; i < expression.length; i++)
if (allowedChars.indexOf(expression.charAt(i)) < 0)
throw new Error("Invalid expression: unexpected '" + expression.charAt(i) + "' in '"+expression+"'");
return eval(expression);
}
try{
\t alert(calculate("4+4"));
\t alert(calculate([7,"+",9,"/",34]));
\t alert(calculate("45/3"));
\t alert(calculate("100 * cheeseburger"));
}catch(e){
\t alert(e.message);
}
Вот почему это безопасно:
- Неправильное использование Eval открывает код для атак путем внедрения
- В
strict mode
eval
не может вводить новые переменных в окружающий объем. (Так как это в конце своей собственной функции, в любом случае ничего не происходит в этой области.) - Функция выдает ошибку, если присутствует какой-либо символ, который не является частью математического выражения, что делает невозможным инъекцию.
- В
- С
eval
, отладкой не может быть более сложными (без номеров строк и т.д.)- В этом случае функция выдает ошибку, которая включает в себя номер строки. Код
eval
'd - это только одна строка, поэтому это не имеет значения.
- В этом случае функция выдает ошибку, которая включает в себя номер строки. Код
eval
«d код не выполняется медленнее (нет возможности компиляции/кэш-код Эвальд)- В этом случае нет ничего компилировать/кэш, так что это не проблема.
- 1. Оцените простое строковое математическое выражение
- 2. Как преобразовать математическое выражение строки в BigInteger?
- 3. как преобразовать строку в математическое выражение программно
- 4. преобразовать выражение в строковое представление?
- 5. Regex - разделенное математическое выражение
- 6. Пролог преобразовать математическое выражение в список?
- 7. Как преобразовать строковое логическое выражение в исполняемое выражение java
- 8. Как преобразовать строковое выражение в код vb?
- 9. Math Выражение «родовое» в Java
- 10. Оценить математическое выражение в строке
- 11. разваливается математическое выражение строки
- 12. математическое выражение для scipy.stats.wald.pdf?
- 13. regex match математическое выражение
- 14. Проанализировать математическое выражение
- 15. antlr4 упрощающий математическое выражение
- 16. Синтаксис Java Математическое выражение
- 17. Математическое выражение как аргумент функции?
- 18. Как преобразовать математическое выражение в строку без оценки в Ruby?
- 19. Как преобразовать строку в математическое выражение в R?
- 20. NCalc математическое выражение в C# -
- 21. Как преобразовать строку, содержащую математическое выражение в целое число?
- 22. Математическое выражение в метке оси
- 23. Математическое выражение в Crystal Reports
- 24. Включить строку в математическое выражение?
- 25. Оценить математическое выражение в строке? (NSString)
- 26. Как превратить простое текстовое выражение в математическое выражение в R
- 27. Оценить математическое выражение в Qt
- 28. Написать математическое выражение в C++
- 29. Невозможно преобразовать математическое выражение в номера в Lua
- 30. регулярная замена строковое выражение
Да, вы можете буквально использовать '10/3 * 4-7' – Tibrogargan
Пожалуйста, смотрите ниже в моем ответе – Aruna