ECMAScript/JavaScript中的:运算符是什么?

ECMAScript/JavaScript中的:运算符是什么?,javascript,Javascript,那么像 {bar: 2} 将返回对象本身,即 {bar: 2} 但是如果我尝试 foo: {bar: 2} 那么我将得到2 接线员到底在这里干什么?我在…中找不到它。JavaScript没有:运算符。但是:用于各种语法产品中 在对象初始值设定项的属性初始值设定项中,将属性名称与属性值分开。这就是您在第一个示例中使用的内容 在语句级别,而不是在对象初始值设定项中,名称后跟:是一个。这就是您的foo:{bar:2}示例。标签主要用于定向中断和继续 :也用于,条件?a:b 那么问题是:为什么在第

那么像

{bar: 2}
将返回对象本身,即

{bar: 2}
但是如果我尝试

foo: {bar: 2}
那么我将得到2

接线员到底在这里干什么?我在…中找不到它。JavaScript没有:运算符。但是:用于各种语法产品中

在对象初始值设定项的属性初始值设定项中,将属性名称与属性值分开。这就是您在第一个示例中使用的内容

在语句级别,而不是在对象初始值设定项中,名称后跟:是一个。这就是您的foo:{bar:2}示例。标签主要用于定向中断和继续

:也用于,条件?a:b

那么问题是:为什么在第一个示例中控制台中看到{bar:2},在第二个示例中控制台中看到2

答案是,这是控制台的特殊行为,有两种不同的方式:

当您在控制台中键入{bar:2}时,它将其视为表达式,因此它将其视为对象初始值设定项,并创建对象,然后记录对象。但是如果在脚本代码的顶层有{bar:2},它将不是一个表达式,而是一个带有标记语句的块。将其视为表达式是特定于控制台的

当您在控制台中键入foo:{bar:2}时,它正确地标识了一个带标签的语句-其中两个,实际上是:foo:。。。酒吧:2。{}是一个块,而不是对象初始值设定项,因此内部条:是一个标签

那么为什么是2呢?因为它向您显示了代码的结果,我们在语法上不可用,但由规范定义。块的结果是该块中最后计算的值,标签是透明的。{bar:2}块中的最后一个值是2,所以该块的值是2,所以它显示的就是这个值。但同样,这不是我们可以在代码中直接观察到的东西,而是控制台行为


首先,缺少其他上下文:

{bar: 2}
不创建对象。它是一个块语句,内部只有一条语句,该语句有一个标签:

{
  bar: // the label
  2    // the expression statement
}
当文本{bar:2}出现在表达式的上下文中时,它只是一个对象,如下所示:

foo({bar: 2}); // a function call to "foo", passing an object
否则,以{开头的语句总是被解释为块

声明

foo: {bar: 2}
基本上是一样的。这里有一个标签foo:在块的外面,还有一个标签条:在块的里面


当您尝试通过浏览器控制台或节点编写代码时,事情会变得很奇怪,因为控制台本身有助于调试的行为,但在某些情况下,这也与语言语义不同。JavaScript不是直接的REPL友好语法,因此控制台机制必须很巧妙。

您正在创建一个带标签的语句。它不是一个运算符。@Pointy是一个带标签的语句?但是带标签的语句返回不同的结果是什么?你把控制台API的行为与语言的实际功能混淆了。语句根本不返回结果。@Pointy-在规范术语中,它们实际上是返回结果的,这就是为什么控制台显示它们的一部分。我们不能获取它们的结果值。@T.J.Crowder是的,这是真的,尽管我从来没有真正理解过语言规范中黑暗角落的意义。这是许多规范中的一个。