云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

云服务器_网上商城网站建设_安全稳定

小七 141 0

在这篇文章中,我想到了JavaScript中的一个特定函数定义,以及它如何在同等程度上体现美观和实用性。

周五晚上,我在推特上写道:

这是我在漫不经心地阅读一些源代码时遇到的,我觉得它相当漂亮。我对这条微博有一些反应。在其中一篇文章中,斯里坎特·佩里要求解释,然后朱莉·普卢默建议我在本周一上午的思想系列文章中以帖子的形式来做。这是个好主意,因为我已经在去woodstore的路上了。

woodstore,我在那里阅读和思考东西(享受一两杯啤酒)。

上下文

所讨论的源代码是一个实用程序,可重用数据.js, 基础存储库SAP/cloud sample spaceflight的一部分,其中包含今年SAP TechEd应用程序编程模型会议的基础核心数据和服务数据模型(请参阅"SAP云平台的应用程序编程模型-从这里开始"),由Christian Georgi和我的语言漫游合作伙伴Christian编写我为什么要读这个?好吧,当然是出于好奇和想多学点东西。我听说程序员只花10%的时间写代码,90%的时间读代码。这听起来很极端,但我可以想象在某些情况下是真的。我猜这不仅包括在扩展或修改代码之前阅读代码以了解它的功能,还包括为了乐趣而阅读代码,以了解其他人是如何编写的。

我记得我在2000年初为我的第一本书《编程喋喋不休》做过研究。我在当地的咖啡店花了很多时间阅读该书的源代码Jabber(现在的XMPP)协议的参考实现–jabberd源代码,由Jeremie Miller和其他人用C编写。我从中学到了很多,我喜欢时不时地阅读别人的代码——尤其是看到每个作者的角色是如何温和地但不可避免地渗入代码中的。为了添加一点上下文,下面是一行代码,并附带注释:

在JavaScript中,Array是一个用于表示列表的全局对象,并且有许多对Array对象实例进行操作的内置函数或方法。

例如,您可以创建一个数组,然后使用Array对象的join()函数,如这是:

(这里的代码示例来自Chrome控制台会话,使用ES6)。

Array对象的另一个内置函数是push(),这是我脑海中作为一个家族考虑的四个函数之一,因为它们做的事情非常相似:

函数shift()和unshift()在数组的前面操作,分别删除或添加元素。函数pop()和push()分别在数组的末尾操作,删除或添加元素。

还有其他函数用于在数组的其他位置操作元素,例如splice()和slice(),物联网的应用,但我们现在要集中讨论的是push()及其同级unshift()。两者都向数组中添加一个或多个元素。在这两种情况下,返回的都是新数组的长度。例如:

这不是不合理的,但它也没有你想象的那么有用。

实用性

在许多情况下,你会想创建一些东西-一个数组,一个地图,另一个更高级别的对象,并操纵它。很多人觉得很自然的一种方法是使用方法链接,这实际上就像说:"做这个,然后那个,然后另一个"。

这在UI5中很常见,例如标准控件,比如sap.m库中的Button控件有方法,其中许多方法返回它们正在操作的Button实例,显式地允许方法链接(参见示例attachPress)。因此,我们可以这样结束,四个方法被"链接"在一起:

以类似的方式,您可能希望创建一个元素列表,通过某种方式重新排列它,在它的末尾添加一些内容,然后映射到每个最终的元素集合,以得到您真正需要的内容。例如:

您希望得到:

但是,最终得到:

这是因为push()函数返回数组(4)的新长度,而不是数组本身。不理想。

更糟糕的是,使用更高级别的函数(如reduce())以及基于ES6的较短的arrow函数样式的函数定义会变得很麻烦。对于arrow函数,函数定义本身要短得多,并且(没有花括号)会隐式返回该函数执行后计算的结果。

如果您不熟悉使用reduce()和利用新的ES6 arrow函数样式,下面是一个精心设计的示例:

这里,我们使用乘法一个数字列表,并利用传递给reduce的函数定义:

隐式返回表达式a*x的结果,将其输入下一个元素迭代,企业信息化应用系统,直到元素列表用尽为止。

换句话说,如果您想使用数组的push()函数作为reduce()场景中传递的函数定义,您不能,或者至少,它的计算结果(数组的新长度)几乎肯定不是您希望输入到下一个迭代中的值—您想要新的(修改过的)数组*.

*您中的热心读者会猜到我现在正在完全忽略push()正在改变数组这一事实有点不舒服,这通常是一件坏事(tm)–但我是故意忽略它的,因为这是另一个时代的另一个主题。

如果你进一步阅读可重用数据.js程序,您将看到在第73行中有一个reduce()函数被用来收集表名:

这个

的用法不是来自Array对象的标准push()函数。相反,这是我们之前定义的push()函数,这篇文章的主题:

现在我们了解了它的使用背景,以及为什么标准push()函数不好,让我们深入了解这个定义,看看它是如何工作的,以及为什么可以使用它。