在evaled时引用的JS对象属性名称不能按预期工作

时间:2017-06-26 11:35:55

标签: javascript

为什么

eval('{pickup : new Date(2012, 7, 23, 15, 49, 0, 0)}')

工作和

eval('{"pickup" : new Date(2012, 7, 23, 15, 49, 0, 0)}')

没有?我得到了

Uncaught SyntaxError: Unexpected token :
at <anonymous>:1:1

然而

{"pickup" : new Date(2012, 7, 23, 15, 49, 0, 0)}

作为对象按预期工作。

2 个答案:

答案 0 :(得分:7)

因为{}被解释为一个块,而不是一个对象文字,这使pickup成为label,而不是对象键。这就是Javascript看到的:

{
  pickup: 
    new Date(2012, 7, 23, 15, 49, 0, 0);
}

如果您希望Javascript将其视为对象文字,请将其指定给某些内容,或者将其作为表达式而不是顶级语句。

答案 1 :(得分:5)

让我们看看第一个:

eval('{pickup : new Date(2012, 7, 23, 15, 49, 0, 0)}')

开始解析:

  • { ...因为我们不在语句环境中,必须是打开块括号。
  • pickup:标签
  • new Date(...)是一个新的约会对象,很简单。
  • }结束代码块。

所以你看到它实际上没有做任何接近你期望的事情:)

现在尝试第二个:

eval('{"pickup" : new Date(2012, 7, 23, 15, 49, 0, 0)}')

同样的事情:

  • {打开块括号
  • "pickup"是一个字符串
  • :是......出乎意料的。语法错误!

要修复,请强制使用表达式上下文:

eval('({pickup : new Date(2012, 7, 23, 15, 49, 0, 0)})')

这将为您提供一个引用新日期对象的pickup属性的对象。