Node.js coffeescript语法{var}?

Node.js coffeescript语法{var}?,node.js,coffeescript,Node.js,Coffeescript,很简单,我在node中看到了以下使用coffeescript的语法,这是我在浏览器中从未见过的 {foo} = app.locals.foo 我前往js2coffee查看它的作用,但它在js输出中似乎是相同的 foo = app.locals.foo 这是怎么回事?在这个上下文中,{}语法是什么意思?您为什么要使用它?来自: 解构分配 为了更方便地从复杂数组和对象中提取值,CoffeeScript实现了ECMAScript Harmony提出的解构赋值语法。当您将数组或对象文字指定给

很简单,我在node中看到了以下使用coffeescript的语法,这是我在浏览器中从未见过的

  {foo} = app.locals.foo
我前往js2coffee查看它的作用,但它在js输出中似乎是相同的

  foo = app.locals.foo
这是怎么回事?在这个上下文中,
{}
语法是什么意思?您为什么要使用它?

来自:

解构分配

为了更方便地从复杂数组和对象中提取值,CoffeeScript实现了ECMAScript Harmony提出的解构赋值语法。当您将数组或对象文字指定给值时,CoffeeScript会分解并使两侧相互匹配,将右侧的值指定给左侧的变量。
[…]
分解结构分配可用于任何深度的数组和对象嵌套,以帮助提取深度嵌套的属性

相关的例子如下:

futurists =
  sculptor: "Umberto Boccioni"
  painter:  "Vladimir Burliuk"
  poet:
    name:   "F.T. Marinetti"
    address: [
      "Via Roma 42R"
      "Bellagio, Italy 22021"
    ]

{poet: {name, address: [street, city]}} = futurists
这是这方面的简写:

name   = futurists.poet.name
street = futurists.poet.address[0]
city   = futurists.poet.address[1]
你可以在行动中看到它

基本上,解构赋值的对象形式允许您以某种自然的方式解包对象。也许一个更简单的例子会有所帮助:

o =
    a: 'b'
    c: 'd'
    e: 'f'

{a, e} = o
这是以下的简写:

a = o.a
e = o.e
还有一个

您可以将解构赋值的左侧视为用于解包右侧的模式。

来自:

解构分配

为了更方便地从复杂数组和对象中提取值,CoffeeScript实现了ECMAScript Harmony提出的解构赋值语法。当您将数组或对象文字指定给值时,CoffeeScript会分解并使两侧相互匹配,将右侧的值指定给左侧的变量。
[…]
分解结构分配可用于任何深度的数组和对象嵌套,以帮助提取深度嵌套的属性

相关的例子如下:

futurists =
  sculptor: "Umberto Boccioni"
  painter:  "Vladimir Burliuk"
  poet:
    name:   "F.T. Marinetti"
    address: [
      "Via Roma 42R"
      "Bellagio, Italy 22021"
    ]

{poet: {name, address: [street, city]}} = futurists
这是这方面的简写:

name   = futurists.poet.name
street = futurists.poet.address[0]
city   = futurists.poet.address[1]
你可以在行动中看到它

基本上,解构赋值的对象形式允许您以某种自然的方式解包对象。也许一个更简单的例子会有所帮助:

o =
    a: 'b'
    c: 'd'
    e: 'f'

{a, e} = o
这是以下的简写:

a = o.a
e = o.e
还有一个


你可以把解构赋值的左侧看作是一种模式,用于解包右侧。

如果我在js2coffee中放入
{foo}=app.locals.foo
,它会说JS输出是
var foo;foo=app.locals.foo.foo
@Juhana:看看类似的东西可能会有点启发。@muistooshort我只是在评论“它在js输出中似乎与…”相同,因为对我来说它似乎不完全相同。@Juhana:我明白了,太多的
foo
让每个人都困惑:)如果我把
{foo}=app.locals.foo
在js2coffee中,它表示JS输出是
var foo;foo=app.locals.foo.foo
@Juhana:看看类似的东西可能会更有启发性一些。@muistooshort我只是对“它在js输出中似乎与…”进行了评论,因为对我来说,它似乎并不完全相同。@Juhana:我明白了,太多的
foo
让每个人都感到困惑:)这是一个非常好的、彻底的答案。但是我仍然不明白为什么我会使用
{foo}
,而不仅仅是
foo
,当它们在js中编译成相同的东西。@Freshyeball:但是,正如Juhuna所指出的,
foo=app.locals.foo
{foo}=app.locals.foo
不会编译成相同的东西
a=b
编译成
a=b
,但是
{a}=b
a=b.a
。这是一个非常好的完整答案。但是我仍然不明白为什么我会使用
{foo}
,而不仅仅是
foo
,当它们在js中编译成相同的东西。@Freshyeball:但是,正如Juhuna所指出的,
foo=app.locals.foo
{foo}=app.locals.foo
不会编译成相同的东西
a=b
编译为
a=b
,但
{a}=b
a=b.a