- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CoffeeScript赋值
CoffeeScript赋值
CoffeeScript有个语法叫解构赋值(Destructuring Assignment) ,可以将⼀个对象的不同成
员⼀次性赋值给多个的变量。官⽹中给 下⾯⼀个例⼦:
futurists =
sculptor: Umberto Boccioni
painter: Vladimir Burliuk
poet:
name: F.T . Marinetti
address: [
Via Roma 4 R
Bellagio, Italy 0 1
]
{poet: {name, address: [street, city]}} = futurists
alert name + — + street
运⾏结果⾃然是 F .T . Marinetti — Via Roma 42R ,因为coffee将其翻译为下⾯的 S :
var city, futurists, name, street, _ref, _ref1;
futurists = {
sculptor: Umberto Boccioni,
painter: Vladimir Burliuk,
poet: {
name: F.T . Marinetti,
address: [Via Roma 4 R, Bellagio, Italy 0 1]
}
};
_ref = futurists.poet, name = _, (_ref1 = _ref.address, st
alert(name + — + street);
这个语法跟Erlang的模式匹配有点类似,不同的是,Erlang会严格匹配等号两边,不赋
值的要⽤_作为占位符,否则运⾏时将抛出异常,⽽coffee则不会,对于不存在的成
员,值为undefined :
{poet: {nameX, address: [streetX, city]}} = futurists
# nameX = undefined
# streetX = F.T . Marinetti
当然,对⼀个不存在的成员继续解析还是会抛出异常的:
{poetX :{a}} = futurists
# TypeError: Cannot read property a of undefined
另外,和 S⼀样,coffee也可以连续赋值:
a=b=100
# a=100
# b=100
假如将上⾯两种语法组合在⼀起,会怎样呢?就像下⾯的代码,最终d=?
a={b:1,c: ,x :3,y :4}
d={b,c}=a
简单分析下:
赋值语句的结合顺序是从右到左,所以 d={b,c}=a 等价于 d=({b,c}=a)
我们还知道,赋值表达式的值是其本⾝,那么 {b,c}=a 的值是什么呢, {b,c} 还
是 a ?
可以尝试下,coffee会将语句 {b,c}=a 转成下⾯的 S :
b = a.b, c = a.c;
这样看来,d最终的值会是2 ,这也太奇怪 吧?
还是看⼀下coffee把 d={b,c}=a 到底翻译成什么吧:
d = (b = a.b, c = a.c, a);
结果在意料之内,d的值不是
结果在意料之外,d的值不是 {b,c}
我⼀直以为,像 {b,c}=a 这样的表达式,返回值将会是 {b,c} ⽽不是 a ,然
后 d={b,c}=a 可以按过滤器的⽅式执⾏。但是,我错 ,{b,c}=a 这个表达式的
值是 a
再写⼏⾏代码验证⼀次:
f = (a) - {b,c}=a
coffee将上⾯的代码翻译成
f = function(a) {
var b, c;
return b = a.b, c = a.c, a;
};
好吧,解析赋值表达式的值确实是等号右边的值。
⾄于 {b,c}=a 为何会被译成 b = a.b, c = a.c; 估计是因为该表达式的值不产
⽣副作⽤,所以coffee把该表达式的值抛弃 。
那么,在 S⾥,普通赋值表达式的值,是不是也是等号右边的值呢?下⾯的 S语句,
result最终应该等于expr 1还是expr2呢?
result = expr1 = expr
乍眼⼀看,可能会觉得 result==expr1 且 result==expr ,等于哪个都⼀样。
文档评论(0)