eval('({"suc":true})')
以上是错误的,应该是:
eval('{"suc":true}')
为什么?
答案 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}))
?