Как преобразовать строку в логическое значение?

Можно ли преобразовать/обернуть значение массива в оператор 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 выполняется динамически.

Обновлено: я нашел ответ, используя функцию:

Выполнить код JavaScript, хранящийся в виде строки

Наличие массива не имеет значения для вашего вопроса. Ваш вопрос: «Как я могу оценить строку, как если бы это был код JavaScript?». Итак, ПОЧЕМУ вы хотите это сделать? Как вы собираетесь обрабатывать вредоносный ввод?

knittl 05.05.2024 15:18

Это правда. Значения массива жестко закодированы, и пользователь не может их изменить.

MArt 05.05.2024 15:21

то, что вы хотите сделать, это использовать интерпретатор в интерпретаторе JS. Какой следующий шаг, поставить еще один интерпретатор в этот интерпретатор, добавленный к интерпретатору javascript?

Mister Jojo 05.05.2024 15:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
3
81
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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?

MArt 05.05.2024 15:20

Добро пожаловать в Stack Overflow. Хотя этот ответ может быть технически правильным (самым правильным), ОП и будущим читателям часто полезно предоставить контекст и объяснение, а не просто код.

jnovack 07.05.2024 17:46

Я думаю, что лучший способ задать этот вопрос: «Как оценить строку, как если бы это был код 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. Но это был лучший ответ на данный момент.

MArt 05.05.2024 16:12

Возможно, для этого вам удастся использовать математический анализатор, хотя я не уверен. Это будет зависеть от того, какие данные вы получите в этой строке.

// 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 ограничение разрешения процесса является обязательным.

Другие вопросы по теме