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()
:如果您将字符串的内容直接放在脚本中,您也会遇到同样的问题