4

1:{key:value}["key"]
2:({key:value})["key"]
我想知道JS解释器是如何处理上述代码的,为什么1不起作用,为什么2起作用?

4

1 回答 1

4

我假设您问这个问题是因为您在 JavaScript REPL(shell)中看到了这种效果。您正在使用一个 JavaScript shell,它假定前导“{”开始一个块语句而不是一个对象字面量。

例如,如果您使用 Chrome 浏览器附带的 JavaScript 解释器,您会看到以下内容:

> {key:"value"}["key"]
["key"]

在这里,Chrome 将您输入的内容视为一个块语句,然后是一个由一个元素组成的数组的表达式,即字符串"key"。所以它用那个表达式的结果来响应,即数组["key"]

但并非所有 shell 都以这种方式工作。如果您将解释器与 node.js 一起使用,那么 #1将为您工作!

$ node
> {key:"value"}["key"]
'value'
> 

在像 Chrome 这样的解释器中,你必须使用括号来告诉它你希望第一部分是一个对象字面量。(顺便说一句,这种技术可以保证在所有shell 中工作,包括节点的)。

编辑

正如其中一条评论所指出的,如果您在实际脚本中的任何地方的表达式上下文中使用该构造,它将产生"value". 看起来令人困惑的是在 shell 中的使用。

Gary Bernhardt在著名的WAT 视频中实际上利用了这一事实。

于 2013-05-07T02:53:10.650 回答