5

i am trying to convert a string value to expression so that i can use it in if condition like:

var StringVal = '20 > 18 && "yes" == "yes"';

if(StringVal){

    ....
}

is it possible to do this, please suggest me.

Thanks

10
  • eval would do it, or most likely the Function equivalent. Commented Sep 10, 2016 at 13:04
  • yes..but it will not work for "yes" == "yes" Commented Sep 10, 2016 at 13:05
  • 1
    Why do you need to do this? Commented Sep 10, 2016 at 13:06
  • i am working on some survey app and from web service i am getting: [[abc]] > 18 && [[xyz]] == "yes" [[abc]] and [[xyz]] stands from previous questions answer and i just replace that [[..]] string to real values and after that i have to check the condition.. Commented Sep 10, 2016 at 13:10
  • i think eval is working... Commented Sep 10, 2016 at 13:10

3 Answers 3

7

It's not generally safe to take input from a user source and evaluate it, but you could use Function evaluation, or eval

var StringVal = '20 > 18 && "yes" == "yes"';
if (new Function('return (' + StringVal + ')')()) {
  console.log('ok');
}

Are eval() and new Function() the same thing?

Update: If you could give further information in your question as to why you feel this is necessary along with an example of your actual code, then a safer solution could be suggested.

Further: In JSON2, eval is used in JSON.parse

https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L491

but you will also notice that some sanitising is performed before eval is called.

Sign up to request clarification or add additional context in comments.

5 Comments

Don't use this method! It is dangerous and unnecessary.
This answers the OP question and states that it is generally not a safe way to do it, I feel the down-vote is unnecessary.
It is because the OP shouldn't do it this way. The OP doesn't know the correct way do to it and you're encouraging bad practice.
No, I'm not encouraging bad practice.
Be aware this won't recognize syntax errors like 'true);(0'.
3

You can use function eval()

try this:

var StringVal = '20 > 18 && "yes" == "yes"';

if(eval(StringVal)){

    ....
}

other example:

var a = '1==3'
var b = '1==1'

console.log(eval(a));
// false
console.log(eval(b));
// true

Comments

2

Note that eval won't directly parse your text as an expression, e.g.

eval('{}'); // undefined

That's because {} is parsed as a block, not as an object initializer expression.

There are several ways to force it to be parsed as an expression, like nesting inside parentheses, or via a return statement. So I would use

function evalExpr(expr) {
  Function("return " + expr + ";");
  return eval("(" + expr + ")");
}
console.log(evalExpr('{}')); // Object {}
try { evalExpr('1),(2') } catch(err) { console.error(err); } // SyntaxError
try { evalExpr('1;2') } catch(err) { console.error(err); } // SyntaxError

eval("(" + expr + ")") evaluates as an expression, and previously Function("return " + expr + ";") checks that the expression does not contain an invalid ) to escape the wrapping parentheses.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.