Можно ли преобразовать/обернуть значение массива в оператор if? Для пояснения: оператор, полученный из моего кода, всегда представляет собой строку в массиве, и я хочу выполнить его в блоке if. Сейчас он не выполняет сравнение, поскольку это строка. Итак, как мне преобразовать строку в оператор, который будет сравниваться?
let counter = 11;
let statement = ['counter > 10']; // array string received from other code (always a string)
if (statement[0]) {
// should be true
}
Ожидается, что результат будет истинным, если оператор if выполняется динамически.
Обновлено: я нашел ответ, используя функцию:
Это правда. Значения массива жестко закодированы, и пользователь не может их изменить.
то, что вы хотите сделать, это использовать интерпретатор в интерпретаторе JS. Какой следующий шаг, поставить еще один интерпретатор в этот интерпретатор, добавленный к интерпретатору javascript?
let counter = 11;
let statement = ['counter > 10']; // (always a string)
if (eval(statement[0])) {
console.info("The statement is true");
} else {
console.info("The statement is false");
}
Это возможно только с помощью eval?
Добро пожаловать в Stack Overflow. Хотя этот ответ может быть технически правильным (самым правильным), ОП и будущим читателям часто полезно предоставить контекст и объяснение, а не просто код.
Я думаю, что лучший способ задать этот вопрос: «Как оценить строку, как если бы это был код Javascript. Есть способ сделать это в JavaScript, используя метод eval
».
let counter = 11;
let statement = ['counter > 10']; // (always a string)
if (eval(statement[0])) {
// should be true
}
Однако я бы очень не рекомендовал использовать это. Это огромный риск для безопасности. Пожалуйста, используйте его только в том случае, если вы знаете, что делаете.
Ссылка: https://www.w3schools.com/jsref/jsref_eval.asp
Спасибо, я нашел другой способ, создав новую функцию, которая, похоже, работает и немного безопаснее, чем eval. Но это был лучший ответ на данный момент.
Возможно, для этого вам удастся использовать математический анализатор, хотя я не уверен. Это будет зависеть от того, какие данные вы получите в этой строке.
// https://github.com/silentmatt/expr-eval/tree/master
// there may be other ways to do this, this is simple though
import Parser from 'expr-eval';
const options = {x:3}; //see the documentation
const parsedStatement = statement[0];
const result = Parser.evaluate(parsedStatement, {options});
console.debug('Expression Result: ', result);
Другие ответы и комментарии упомянули
eval
- очевидно, самый опасныйnew Function
— легко загрязнить глобальную область видимостиЕсли вы действительно хотите выполнить какой-либо код, изолированная виртуальная машина может помочь. (только в Node.js)
Кроме того, при использовании isolated-vm
ограничение разрешения процесса является обязательным.
Наличие массива не имеет значения для вашего вопроса. Ваш вопрос: «Как я могу оценить строку, как если бы это был код JavaScript?». Итак, ПОЧЕМУ вы хотите это сделать? Как вы собираетесь обрабатывать вредоносный ввод?