CoffeeScript的解构赋值.pdfVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CoffeeScript的解构赋值

CoffeeScript的解构赋值 CoffeeScript有个语法叫解构赋值(Destructuring Assignment) ,可以将⼀个对象的不同成 员⼀次性赋值给多个的变量。官⽹中给 下⾯⼀个例⼦: futurists = sculptor: Umberto Boccioni painter: Vladimir Burliuk poet: name: .T . Marinetti address: [ Via Roma 42R Bellagio , Italy 2202 1 ] {poet: {name , address: [street , city]}} = futurists alert name + — + street 运⾏结果⾃然是 .T . Marinetti — Via Roma 42R ,因为coffee将其翻译为下⾯的JS : var city , futurists, name , street , _ref , _ref 1; futurists = { sculptor: Umberto Boccioni, painter: Vladimir Burliuk , poet: { name: .T . Marinetti, address: [Via Roma 42R , Bellagio , Italy 2202 1] } }; _ref = futurists.poet , name = _ref .name , (_ref 1 = _ref .address, street = _ref 1[0], city = _ref 1[1]); alert(name + — + street); 这个语法跟Erlang的模式匹配有点类似,不同的是,Erlang会严格匹配等号两边,不赋 值的要⽤_作为占位符,否则运⾏时将抛出异常,⽽coffee则不会,对于不存在的成 员,值为undefined : {poet: {nameX , address: [streetX , city]}} = futurists # nameX = undefined # streetX = .T . Marinetti 当然,对⼀个不存在的成员继续解析还是会抛出异常的: {poetX:{a}} = futurists # TypeError: Cannot read property a of undefined 另外,和JS⼀样,coffee也可以连续赋值: a=b= 100 # a= 100 # b= 100 假如将上⾯两种语法组合在⼀起,会怎样呢?就像下⾯的代码,最终d=? a={b:1,c:2,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 转成下⾯的JS : b = a.b , c = a.c; 这样看来,d最终的值会是2 ,这也太奇怪 吧? 还是看⼀下coffee把 d={b ,c}=a 到底翻译成什么吧: d = (b = a.b , c = a.c , a); 结果在意料之内,d的值不是 2 结果在意料之外,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把该表达式的值抛弃 。 那么,在JS⾥,普通赋值表达式的值,是不是也是等号右边的值呢?下⾯的JS语句, result最终应该等

文档评论(0)

ctuorn0371 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档