eval('({"suc":true})')
The above is wrong,should be:
eval('{"suc":true}')
Why?
I don't know what you want to achieve, but from your examples first is correct and the second throws syntax error.
eval('({"suc":true})') is the same as ({"suc":true}) and JavaScript interprets it as:
( // <- this states begining of expression
{ // <- this is hash/object literal begining
"suc": // <- this is property name, given as string
true // <- this is value
}
)
So it returns new object with suc property and associated value true.
eval('{"suc":true}') is the same as {"suc":true} and is interpreted as:
{ // <- this is block begining
"suc": // <- this is label, but incorrect, as it is given as string, not literally
true // <- this is expression
}
If you change "suc" to suc (without parentheses), then it would work, but it's not the same as first example.
UPDATE:
As to why array doesn't need parentheses: there is no other construct in JavaSript which would start with [ character other than array.
There would be no problem with { if it would show up in context which expects value like this:
eval('var a = {"succ": true}')
It's the same in source code (so not only in eval block): you can't create object using short notation ({ .. }) without assigning it to some variable or passing as value (to function, return statement...).