V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
e8c47a0d
V2EX  ›  JavaScript

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

  •  
  •   e8c47a0d · 2017-06-28 11:29:55 +08:00 · 2361 次点击
    这是一个创建于 2684 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    其它 { 会被识别为 object literal

    只有 object literal 中的 identifier: 会被识别为属性的定义,其它 identifier: 会被识别为标签。
    ghostheaven
        9
    ghostheaven  
       2017-06-28 19:17:39 +08:00 via Android
    如果语法上没有歧义,那就没有问题,有歧义的话语法解析会自动选择一种方式消除歧义,如果不能消除就是语法错误。
    guokeke
        10
    guokeke  
       2017-06-29 21:25:56 +08:00
    @e8c47a0d 可是如果不拿出来,由于函数作用域的关系,函数内部是取不到 lorem 的吧。
    e8c47a0d
        11
    e8c47a0d  
    OP
       2017-06-30 10:55:28 +08:00
    @guokeke 原来你是说这个啊,改成函数忘记去掉了,那行没有意义。
    @chairuosen 第二段的 lorem: 和 ipsum: 都是标签,{} 是代码块,这个写法是把标签和代码块写在一起,所以会有点混淆。但这么写的好处是,方便折叠归类(比如 atom )。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2485 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:31 · PVG 18:31 · LAX 03:31 · JFK 06:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.