【问题标题】:What is the behavior of typing {a:1} giving 1, and {a:1, b:2} giving an error in a Javascript console?在 Javascript 控制台中输入 {a:1} 给出 1 和 {a:1, b:2} 给出错误的行为是什么?
【发布时间】:2011-04-13 12:09:58
【问题描述】:

以下内容将显示在 Firebug 或 jsconsole.com 或其他 Javascript 交互式控制台中:

>>> foo = { a : 1, b : 2.2 }
Object { a=1, more...}

>>> foo.a
1

>>> foo.b
2.2

>>> { a : 1, b : 2.2 }
SyntaxError: invalid label { message="invalid label", more...}

>>> { a : 1 }
1

为什么1 会返回{a : 1},为什么{a : 1, b : 2.2} 会出错?在 Ruby 中,它们会以您定义的方式返回。

【问题讨论】:

标签: javascript firebug javascript-objects


【解决方案1】:

第二行给你一个SyntaxError,因为它开头的{ 标记会导致歧义,解析器将其视为Block statement,而不是对象文字的开头。

例如,一个有效的 Block 语句:

{ foo: 'bar' }

上面的看起来像一个对象字面量,但其实不是,因为代码是在语句上下文中计算的。

它将被解析为一个 Block,其中包含一个 labelled statement (foo),后跟一个表达式语句 ('bar')。

为确保您使用的是对象字面量的语法,您可以将其用括号括起来(也称为the grouping operator):

({ foo: 'bar' })

分组运算符只能取表达式,因此没有歧义。

另见:

【讨论】:

  • +1 我今天学到了一些新东西。我从来没有将对象文字语法放入 REPL 而不将其分配给 var,但这很有趣..
  • ('labelled statement' 是 JavaScript 继承自 C 的东西,它可以用于 gotos。labeled statements 在 JavaScript 中几乎从不使用,这就是为什么它令人惊讶{foo: 'bar'} 可以被视为有效声明。)
【解决方案2】:

我不是 100% 肯定的,但我认为正在发生的事情是,在第二行中你定义了一个块,而不是一个对象。因此,当解析器到达逗号时会出现解析错误,因为它需要半色。定义的标签是标签,就像在 goto 或 switch 语句中一样。我希望这个解释有意义。

【讨论】:

    【解决方案3】:

    console do as eval('you input')

    eval({....}) --- this will get an error
    eval('({....})')---eval string as a function
    

    【讨论】:

    • 您是否试图显示eval("{}")eval("({})") 之间的区别并且不小心忘记了引号?如果您解决此问题,则每种情况的描述都不正确。如果不是,则此答案与问题无关。答案也没有解释为什么一种语法与另一种语法不正确以及eval 与其中任何一种语法有何关系。
    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多