2013-03-13 104 views
0

非常简单,我在节点中看到使用coffeescript的以下语法,我从未在浏览器中看到过使用coffeescript。coffeescript语法{var}?

{foo} = app.locals.foo 

我领导交给js2coffee,看看这是什么一样,但它似乎是在JS输出相同

foo = app.locals.foo 

那么,什么是怎么回事?在这种情况下,{}语法是什么意思?你为什么要用它?

+0

如果我把'{foo} = app.locals.foo'放入js2coffee中,它表示JS输出是'var foo; foo = app.locals.foo.foo;' – JJJ 2013-03-13 19:48:00

+0

@Juhana:看起来像['{a,b} = c'](http://coffeescript.org/#try:%7Ba%2C%20b%7D %20%3D%20c)可能会更有启发性。 – 2013-03-13 19:52:29

+0

@ muistooshort我只是评论*“在js输出中似乎是相同的......”*因为对我来说它看起来并不相同。 – JJJ 2013-03-13 19:53:37

回答

5

fine manual

解构赋值

从复杂的阵列使提取值和对象更方便,CoffeeScript的实现ECMAScript的和谐提出的解构赋值语法。当您将数组或对象字面量赋值给某个值时,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] 

,你可以看到它在行动over here

基本上,解构结构赋值的对象形式允许您以某种自然的方式解压缩对象。也许一个简单的例子可以帮助:

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

{a, e} = o 

这对速记:

a = o.a 
e = o.e 

而另一demo

您可以将解构结构赋值的左侧视为用于解开右手边的模式。

+0

这是一个非常好的答案。但是我仍然不明白为什么我们在使用'{foo}'而不是'foo'时,它们在js中被编译为相同的东西。 – Fresheyeball 2013-03-13 21:37:49

+2

@Fresheyeball:但是,正如Juhuna指出的那样,'foo = app.locals.foo'和'{foo} = app.locals.foo'不会编译成相同的东西。 'a = b'编译为'a = b',但'{a} = b'为'a = b.a'。 – 2013-03-13 22:24:22

+0

明白了,谢谢。 – Fresheyeball 2013-03-13 22:51:24