Могу ли я получить «значение» произвольного оператора в JavaScript (как это делает eval, но без eval) - PullRequest
2 голосов
/ 17 марта 2010

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

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

Является ли eval просто наделенным особыми полномочиями для определения "последнего" значения оператора в выражении?

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

Ответы [ 3 ]

1 голос
/ 17 марта 2010

Для оценки произвольного кода javascript в javascript у вас есть три варианта

  • Eval. Обычно это считается «опасным», но поскольку на компьютере клиента выполняется javascript, они могут нанести вред только себе (если вы не предоставите клиентам способ поделиться своими кодами).
  • Функция Конструктор. То же относится и к делу.
  • написать интерпретатор JavaScript. Это определенно сложно для «произвольного» кода.
1 голос
/ 17 марта 2010
function(expr) { return eval(expr); }

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

Например:

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 )

0 голосов
/ 17 марта 2010

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

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

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

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

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

var t = 0 && null && undefined && 'd'; // assigns 0
...