Могу ли я получить значение произвольного оператора в JavaScript (как это делает eval, но без eval)

В JavaScript есть способ получить «значение» оператора таким же образом, как function() { return eval("if (true) { 1 }"); } возвращает «1»;

function() { return if (true) { 1 } } и все подобные перестановки, которые я пробовал, недействительны синтаксис.

Неужели eval наделен особыми способностями определять «последнее» значение оператора в выражении?

Вариант использования — это REPL, который оценивает произвольные выражения и возвращает результат. eval работает, но я хочу обернуть его функцией.


person tlrobinson    schedule 17.03.2010    source источник


Ответы (3)


function(expr) { return eval(expr); }

Но на самом деле это не делает ничего большего, чем то, что делает eval, поэтому я предполагаю, что вы должны захотеть сделать что-то с возвращаемым значением eval, прежде чем возвращать его?

E.g.:

function custom_eval(expr) 
{
  var result = eval(expr);
  if ((typeof result))=="string")
  { 
     alert("The expression returned a string value of: " + result); 
  }
  if ((typeof result))=="number")
  {
     alert("The expression returned a number with value: " + result);
  }
  //and so on and so forth...
  return result;
 }

 var bob = custom_eval("x=\"bob\";x");
 alert(bob);

(Подробнее об операторе typeof)

person Mike Atlas    schedule 17.03.2010
comment
Я не думаю, что это то, что он искал, но стоит упомянуть, что typeof НЕ является функцией, и ее следует использовать как typeof result, а не typeof(result). - person bcherry; 17.03.2010
comment
Здесь по-прежнему используется eval, который выполняет любой код в строке expr. Это может быть очень опасно, так как ОП описывает, что строка может содержать произвольные выражения. - person Marcel Korpel; 17.03.2010
comment
@Marcel: ОП не просто сказал, что строка может содержать любое произвольное выражение, ОП сказал, что он хочет ВЫПОЛНИТЬ эти произвольные выражения (оценивать было его слово). - person slebetman; 17.03.2010
comment
@Marcel: Чтобы определить значение конечного выражения, оно должно быть оценено (выполнено), иначе OP, к сожалению, придется решать проблему остановки en.wikipedia.org/wiki/Halting_problem. - person Mike Atlas; 17.03.2010
comment
@Mike: Интересно, спасибо за ссылку. И я должен признать, что я тоже не могу решить это без использования eval. - person Marcel Korpel; 17.03.2010

Чтобы оценить произвольный код javascript в javascript, у вас есть три варианта.

  • оценить Обычно это считается «опасным», но поскольку javascript выполняется на компьютере клиента, они могут только навредить себе (если только вы не предоставите клиентам возможность поделиться своими кодами).
  • Конструктор Function. Применяются те же опасения.
  • написать интерпретатор javascript. Это определенно сложно для «произвольного» кода.
person user187291    schedule 17.03.2010

Вы можете использовать ||, чтобы получить значение first, отличное от null/undefined/0:

var t = 1 || 'b' || 3 || 'd'; // assigns 1

var t = 0 || null || undefined || 'd'; // assigns d

Вы можете использовать &&, чтобы получить последнее значение, если сначала не найдено короткое замыкание null/undefined/0:

var t = 1 && 'b' && 3 && 'd'; // assigns d

var t = 0 && null && undefined && 'd'; // assigns 0
person machine elf    schedule 17.03.2010