javascript,对象逻辑和对象,语法错误?

javascript,对象逻辑和对象,语法错误?,javascript,google-chrome,Javascript,Google Chrome,看 代码示例 eval("true && {a:1} && {b:2} && alert('this is ok');") eval("{a:1} && {b:2} && alert('this should be ok~~');") eval跳过语法错误 我错过了什么 测试: 29.0.1547.76米win7 ie9在Javascript中有两种含义 对象文本(如x={a:1}) 带有标签的代码块(如whi

代码示例

eval("true && {a:1} && {b:2} && alert('this is ok');")

eval("{a:1} && {b:2} && alert('this should be ok~~');")
eval跳过语法错误

我错过了什么

测试:

29.0.1547.76米win7


ie9在Javascript中有两种含义

  • 对象文本(如
    x={a:1}
  • 带有标签的代码块(如
    while(x){a:1}
具体的解释取决于解析器遇到开口时的状态。
{
。在“语句”状态中,
{A:1}
将是一个块,在“表达式”状态中是一个文本。由于解析总是在语句状态下开始,
{A:1}&&x
将被读取为
块和表达式
,这是一个语法错误。相反,在
x&&{a:1}
中,
&&
强制解析器进入“表达式”状态,
{a:1}
将是一个文本(无错误)


要确保
{a:1}
始终是一个文本,请在其前面放一个运算符或大括号使其成为一个表达式,例如
+{a:1}
!!{a:1}
({a:1}
等。

问题是第二个字符串以
开头{
,它被视为块的开头,而不是对象文字的开头。请尝试以下操作:

eval("({a:1}) && {b:2} && alert('this should be ok~~');")
通过在第一个对象周围添加括号,它不会被解释为代码块的开头。(第二个对象,
{b:2}
是可以的,因为它出现在
&&
之后,因此此时解释器不需要代码块。)

请注意,这并不是因为您使用的是
eval()
:如果您将字符串的内容直接放在脚本中,您也会遇到同样的问题