javascript eval

时间:2009-12-08 06:20:57

标签: javascript eval

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

以上是错误的,应该是:

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

为什么?

4 个答案:

答案 0 :(得分:4)

当试图评估解释器时,看到大括号并认为它是一个块开始。括在括号中使它成为一个表达式并正确初始化一个对象。

答案 1 :(得分:1)

我不知道你想要实现什么,但是从你的例子开始是正确的,第二个抛出语法错误。

eval('({"suc":true})')({"suc":true})相同,JavaScript将其解释为:

( // <- this states begining of expression
    { // <- this is hash/object literal begining
        "suc": // <- this is property name, given as string
            true // <- this is value
    }
)

因此它返回具有suc属性和关联值true的新对象。

eval('{"suc":true}'){"suc":true}相同,并被解释为:

{ // <- this is block begining
    "suc": // <- this is label, but incorrect, as it is given as string, not literally
        true // <- this is expression
}

如果您将"suc"更改为suc(没有括号),那么它会起作用,但它与第一​​个示例不同。

更新

至于为什么数组不需要括号:JavaSript中没有其他构造以数组以外的[字符开头。

如果{出现在需要这样的值的上下文中,那就没问题了:

eval('var a = {"succ": true}')

在源代码中是相同的(所以不仅在eval块中):你不能使用短符号({ .. })创建对象而不将其分配给某个变量或作为值传递(到函数,返回语句) ...)。

答案 2 :(得分:0)

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

实际上并没有错,它会被正确评估。

答案 3 :(得分:0)

您是否尝试过使用JSON.parse('{"suc":true}))