proposal-extractors是一个增强解构能力的提案,支持在直接解构时执行自定义逻辑。概述const[first,second]=arr;const{姓名,年龄}=对象;以上就是解构带来的便利,如果没有解构语法,我们需要做同样的实现:constfirst=arr[0];constsecond=arr[1];constname=obj.name;constage=obj.age;但是上面更原始的方法可以在赋值对象的时候做一些处理,例如:constfirst=someLogic(arr[0]);constsecond=someLogic(arr[1]);constname=someLogic(obj.name);constage=someLogic(obj.age);解构语法不是那么简单。要实现类似的效果,需要退化为多行代码实现,冗余度甚至超过非解构语法:const[first:firstTemp,second:secondTemp]=arrconst{name:nameTemp,age:ageTemp}=objconstfirst=someLogic(firstTemp)constsecond=someLogic(secondTemp)constname=someLogic(nameTemp)constage=someLogic(ageTemp)proposal-extractors提案用于解决这个问题,希望在保持解构语法优雅的同时添加一些额外的逻辑:constSomeLogic(first,second)=arr//解构数组constSomeLogic{name,age}=obj//解构对象有点别扭,用()解构数组,用{}解构对象。我们再看一下SomeLogic的定义:constSomeLogic={[Symbol.matcher]:(value)=>{return{matched:true,value:value.toString()+"specialprocessing"};},};将接收到的first、second、name、age变量全部转换成字符串,并在后缀中加上‘特殊对待’四个字符。为什么用()来表示数组解构呢?主要目的是防止赋值歧义://当只有一项时,[]是表示下标还是解构?constSomeLogic[first]=arrConstproposal-extractorsproposalmentionedBindingPatternandAssignmentPattern://绑定模式constFoo(y)=x;//实例数组destructuringconstFoo{y}=x;//实例对象destructuringconst[Foo(y)]=x;//嵌套常量[Foo{y}]=x;//..const{z:Foo(y)}=x;//..const{z:Foo{y}}=x;//..constFoo(Bar(y))=x;//..constX.Foo(y)=x;//限定名称(即a.b.c)//赋值模式Foo(y)=x;//实例数组destructuringFoo{y}=x;//实例对象解构[Foo(y)]=x;//嵌套[Foo{y}]=x;//..({z:Foo(y)}=x);//..({z:Foo{y}}=x);//..Foo(Bar(y))=x;//..X.Foo(y)=x;//限定名(即a.b.c)从例子来看,BindingPattern只是在AssignmentPattern前面多了一个const标签。那么BindingPattern和AssignmentPattern是什么意思呢?BindingPattern和AssignmentPattern是解构模式中特有的概念。BindingPattern需要用constlet等变量定义器来描述。比如下面的例子,生成了两个新的对象a和d,我们称这两个对象为bound。constobj={a:1,b:{c:2}};const{a,b:{c:d},}=obj;//绑定了两个变量:`a`和`d`不需要使用AssignmentPattern变量定义器描述只能使用已定义的变量,这样可以理解就像给这些已有的变量赋值一样。例如,下面的示例将对象的ab分别绑定到数组numbers的每一项。constnumbers=[];constobj={a:1,b:2};({a:numbers[0],b:numbers[1]}=obj);proposal-extractors是解构的增强proposals,自然也支持BindingPattern和AssignmentPattern这两种模式。总结proposal-extractors提案保持了解构的优雅(自定义解构仍然只需要一行代码),但是引入了新的语法(自定义处理函数,对数组使用()number解构的奇怪记忆),在过程代码和有优势不大,但结合其他特性可能会有意想不到的便利,比如结合Declarations-in-Conditionals可以快速判断是否是某个类的实例,同时解构if/whilelet绑定。讨论地址是:Jingdu《proposal-extractors》·Issue#443·dt-fe/weekly想参与讨论的请戳这里,每周都有新话题,周末或周一发布。前端精读——帮你过滤靠谱的内容。关注前端精读微信公众号
