当前位置: 首页 > 科技观察

反思JavaScript:关于For循环的死亡

时间:2023-03-16 14:41:05 科技观察

我们已经使用JavaScript的for循环很长时间了。但是现在,在最新的函数式编程技术的支持下,过时的它应该退役了。幸运的是,您不必成为函数式编程大师也可以进行此更改。更幸运的是,这是您可以在手头的项目中立即完成的事情!我们一直在使用JavaScript的for循环。但是现在,在最新的函数式编程技术的支持下,过时的它应该退役了。幸运的是,您不必成为函数式编程大师也可以进行此更改。更幸运的是,这是您可以在手头的项目中立即完成的事情!那么JavaScript的for循环有什么问题呢?for循环设计本身鼓励改变状态和产生副作用,这两者都是错误和不可预测代码的潜在陷阱。我们都知道全局状态不好,应该避免。然而,局部状态和全局状态一样糟糕,只是因为局部状态的规模较小并且不被注意。因此,我们并没有真正解决问题,而是试图将其最小化。对于可变状态,在某个未知的时间点,变量会因某种未知原因而发生变化。此时,您可以花费数小时调试以找出此值更改的原因。光是这件事,我不知道掉了多少根头发。接下来,我想简单谈谈副作用。这个词听起来很烦人,而且副作用……该死!您希望您的程序有副作用吗?当然不是!但什么是副作用?当函数修改其范围之外的内容时,据说函数会产生副作用。它可以是更改变量的值、读取键盘输入、调用API、将数据写入磁盘、打印日志等等。副作用是强大的,但它们也伴随着巨大的责任。应尽可能消除副作用,要么封装在内部,要么控制。有副作用的函数很难测试和推断,所以尽你所能摆脱它。幸运的是,这里无需担心副作用。好了,废话不多说,上代码吧。让我们来看看这个您可能已经看过一千次的典型for循环:constcats=[{name:'Mojo',months:84},{name:'Mao-Mao',months:34},{name:'Waffles',months:4},{name:'Pickles',months:6}]varkittens=[]//典型的拙劣写法:forloopfor(vari=0;icat.months<7varkittens=[]for(vari=0;icat.months<7constgetName=cat=>cat.namevarkittens=[]for(vari=0;icat.months<7constgetName=cat=>cat.nameconstkittens=cats.filter(isKitten).map(getName)还要付出代价注意,我们已经删除了kittens.push(...)。不再有可变状态,也不再有var!使用const的代码非常性感(优于var和let)。这里说明一下,我们可以从头到尾都使用const,因为const并不能使对象本身不可变(这个我们下次再说)。别担心,这只是一个例子,让我休息一下!重构的最后一步是将过滤和映射方法提取到一个函数中(为了复用,你懂的):集成是这样的:constisKitten=cat=>cat.months<7constgetName=cat=>cat.nameconstgetKittenNames=cats=>cats.filter(isKitten).map(getName)constcats=[{name:'Mojo',months:84},{name:'Mao-Mao',months:34},{name:'Waffles',months:4},{name:'Pickles',months:6}]constkittens=getKittenNames(cats)console.log(kittens)你会如何进一步分解这些函数?仔细想想“小于”或者name属性,map或者filter,说不定会有额外的收获。还可以研究函数的构成,收益更大。原文:RethinkingJavaScript:DeathoftheForLoop译文:众成译者:camiler