JavaScript 是如何区分标签和对象的……

2017-06-28 11:29:55 +08:00
 e8c47a0d

这两段代码,都用 curly braces 来包裹内容,

let lorem = {
  ipsum: {
    go (v) {
      return;
    }
  }
};
lorem: {
  ipsum: {
    function go () {
      if (v === void 0) break lorem;
    }
  }
}

第一个 ipsum 是 plainObject,第二个 ipsum 是一个 label。 会不会有极端条件,会让 JS 无法区分这两个?

2279 次点击
所在节点    JavaScript
11 条回复
bombless
2017-06-28 12:46:13 +08:00
对象字面量中哪来的 label
e8c47a0d
2017-06-28 12:54:16 +08:00
ipsum: 相当于其他语言用 goto 可以跳转的标签,ipsum: 后面的花括号 {} 是一个 block (代码块),两者无关系。
guokeke
2017-06-28 17:57:53 +08:00
感觉你第二个语法错误啊。。label 要写在外面吧
guokeke
2017-06-28 18:34:25 +08:00
```
lorem: {
ipsum: {
function go (v) {
return v === void 0;
}
if (go()) break lorem;
}
}
```
e8c47a0d
2017-06-28 18:51:06 +08:00
@guokeke 这段执行后,程序就会走到最后一个“}”
chairuosen
2017-06-28 19:07:01 +08:00
第二种写法是从哪看的? JS 里没这种写法
TYchen
2017-06-28 19:10:03 +08:00
么见过- -。。。
bumz
2017-06-28 19:17:02 +08:00
不存在这样的条件

因为只有在一个 statement 最开头的 { 会被识别为 statement group

其它 { 会被识别为 object literal

只有 object literal 中的 identifier: 会被识别为属性的定义,其它 identifier: 会被识别为标签。
ghostheaven
2017-06-28 19:17:39 +08:00
如果语法上没有歧义,那就没有问题,有歧义的话语法解析会自动选择一种方式消除歧义,如果不能消除就是语法错误。
guokeke
2017-06-29 21:25:56 +08:00
@e8c47a0d 可是如果不拿出来,由于函数作用域的关系,函数内部是取不到 lorem 的吧。
e8c47a0d
2017-06-30 10:55:28 +08:00
@guokeke 原来你是说这个啊,改成函数忘记去掉了,那行没有意义。
@chairuosen 第二段的 lorem: 和 ipsum: 都是标签,{} 是代码块,这个写法是把标签和代码块写在一起,所以会有点混淆。但这么写的好处是,方便折叠归类(比如 atom )。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/371623

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX