见这里;
代码示例
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
即9
见这里;
代码示例
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
即9
{a:1}
在Javascript中有两个含义
x = {a:1}
)while(x) {a:1}
)具体解释取决于解析器遇到开场时的状态{
。在“语句”状态{a:1}
将是一个块,在“表达式”状态 - 一个文字。由于解析总是从语句状态开始,{a:1} && x
将被读取为block && expression
语法错误。相反, in x && {a:1}
,&&
强制解析器进入“表达式”状态,并且{a:1}
将是文字(无错误)。
要确保{a:1}
始终是文字,请在其前面放置一个运算符或大括号以使其成为表达式,例如+{a:1}
,!!{a:1}
等({a:1})
。
问题是第二个字符串以 a 开头{
,它被视为块的开头,而不是对象文字的开头。尝试这个:
eval("({a:1}) && {b:2} && alert('this should be ok~~');")
通过在第一个对象周围添加括号,它不会被解释为代码块的开头。(第二个对象{b:2}
是可以的,因为它出现在&&
so 之后,此时解释器并不期待一个块。)
请注意,这不是因为您正在使用eval()
: 如果您将字符串的内容直接放在脚本中,您将遇到同样的问题。