见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
答案 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}
是正常的,因为它出现在&&
之后,因此在那时解释器不会期待一个块。)
请注意,这不是因为您使用的是eval()
:如果您将字符串的内容直接放在脚本中,则会遇到同样的问题。