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

P H*_*ans 2 javascript

为什么

eval('{pickup : new Date(2012, 7, 23, 15, 49, 0, 0)}')
Run Code Online (Sandbox Code Playgroud)

工作和

eval('{"pickup" : new Date(2012, 7, 23, 15, 49, 0, 0)}')
Run Code Online (Sandbox Code Playgroud)

才不是?我明白了

Uncaught SyntaxError: Unexpected token :
at <anonymous>:1:1
Run Code Online (Sandbox Code Playgroud)

但是

{"pickup" : new Date(2012, 7, 23, 15, 49, 0, 0)}
Run Code Online (Sandbox Code Playgroud)

作为一个对象按预期工作.

dec*_*eze 7

因为{}被解释为一个块,而不是一个对象文字,它产生pickup一个标签,而不是一个对象键.这是Javascript看到的:

{
  pickup: 
    new Date(2012, 7, 23, 15, 49, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

如果您希望Javascript将其视为对象文字,请将其指定给某些内容或以其他方式使其成为表达式而不是顶级语句.


Nie*_*sol 5

让我们来看看第一个:

eval('{pickup : new Date(2012, 7, 23, 15, 49, 0, 0)}')
Run Code Online (Sandbox Code Playgroud)

开始解析:

  • {...因为我们不在声明上下文中,必须是一个开放的块括号.
  • pickup:是一个标签
  • new Date(...) 是一个新的约会对象,很简单.
  • } 结束代码块.

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

现在尝试第二个:

eval('{"pickup" : new Date(2012, 7, 23, 15, 49, 0, 0)}')
Run Code Online (Sandbox Code Playgroud)

一样:

  • {是一个开放的块支架
  • "pickup" 是一个字符串
  • :是...出乎意料的.语法错误!

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

eval('({pickup : new Date(2012, 7, 23, 15, 49, 0, 0)})')
Run Code Online (Sandbox Code Playgroud)

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