开发者

javascript eval

开发者 https://www.devze.com 2022-12-13 07:43 出处:网络
eval(\'({\"suc\":true})\') The above is wrong,should be: eval(\'{\"suc\":tru开发者_JAVA百科e}\') Why?When trying to evaluate the interpreter sees the curly brace and thinks it is a block beginnin
eval('({"suc":true})')

The above is wrong,should be:

eval('{"suc":tru开发者_JAVA百科e}')

Why?


When trying to evaluate the interpreter sees the curly brace and thinks it is a block beginning. Enclosing in parenthesis makes it an expression and initializes an object correctly.


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...).


eval('({"suc":true})')

Thats not wrong actually, it will be evaluated properly.


Have you tried to use JSON.parse('{"suc":true})) instead?

0

精彩评论

暂无评论...
验证码 换一张
取 消