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

时间:2013-09-21 09:30:42

标签: javascript google-chrome

here;

代码示例

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 m win7

IE9

2 个答案:

答案 0 :(得分:5)

{a:1}在Javascript中有两个含义

  • 一个对象文字(如x = {a:1}
  • 带有标签的代码块(如while(x) {a:1}

具体解释取决于解析器遇到空缺{时的状态。在“语句”状态中,{a:1}将是一个块,处于“表达式”状态 - 文字。由于解析始终在语句状态中启动,因此{a:1} && x将被读取为block && expression,这是语法错误。相反,在x && {a:1}中,&&强制解析器处于“表达式”状态,{a:1}将是文字(无错误)。

要确保{a:1}始终是文字,请在其前面添加运算符或括号以使其成为表达式,例如+{a:1}!!{a:1}({a:1})等。

答案 1 :(得分:3)

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

eval("({a:1}) && {b:2} && alert('this should be ok~~');")

通过在第一个对象周围添加括号,它不会被解释为代码块的开头。 (第二个对象{b:2}是正常的,因为它出现在&&之后,因此在那时解释器不会期待一个块。)

http://jsfiddle.net/q3sZ9/1/

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

相关问题