指示函数使用“参数”对象的最清晰方法是什么?

2024-03-05

指示函数使用“参数”对象的最佳方式是什么?
这显然是基于意见的,但是有任何约定吗?什么时候使用参数数组更好?

一些例子:

// Function takes n arguments and makes them pretty.
function manyArgs() {
    for (var i = 0; i < arguments.length; i++)
    console.log(arguments[i]);
}

function manyArgs( /* n1 , n2, ... */ )

function manyArgs(n1 /*, n2, ... */ )

function manyArgs(argArray)

我从不在 JavaScript 中使用可变参数。有许多更好的方法来构建代码。例如,我将重写您的代码如下:

[1,2,3,4,5].forEach(log); // instead of manyArgs(1,2,3,4,5);

function log(a) {
    console.log(a);
}

它清晰简洁。

另一个例子,如果你想在 JavaScript 中查找数字列表的总和:

[1,2,3,4,5].reduce(add, 0); // instead of add(1,2,3,4,5);

function add(a, b) {
    return a + b;
}

有太多有用的抽象可用于构建代码,我根本看不到使用可变参数的好处。

不过我确实使用arguments默认值对象:

function foo(a,b,c) {
    switch (arguments.length) {
    case 0: a = "default argument for a";
    case 1: b = "default argument for b";
    case 2: c = "default argument for c";
    }

    // do something with a, b & c
}

因此,我对您的建议是根本不要使用可变参数。为您的代码找到更好的抽象。在我使用 JavaScript 编程的 8 年里,我从未遇到过使用可变参数的需要。


Edit:我主张使用更实用的方法来编写代码。我们可以使用柯里化来使代码更加简洁:

function curry(func, length, args) {
    switch (arguments.length) {
    case 1: length = func.length;
    case 2: args = [];
    }

    var slice = args.slice;

    return function () {
        var len = arguments.length;
        var a = args.concat(slice.call(arguments));
        if (len >= length) return func.apply(this, a);
        return curry(func, length - len, a);
    };
}

Using curry我们可以将求和示例重写如下:

var reduce = curry(function (func, acc, a) {
    var index = 0, length = a.length;
    while (index < length) acc = func(acc, a[index++]);
    return acc;
});

var sum = reduce(add, 0);

sum([1,2,3,4,5]); // instead of add(1,2,3,4,5);

function add(a, b) {
    return a + b;
}

同样对于Math.max and Array.prototype.concat:

var reduce1 = curry(function (func, a) {
    if (a.length === 0)
        throw new Error("Reducing empty array.");
    return reduce(func, a[0], a.slice(1));
});

var maximum = reduce1(max);

maximum([1,2,3,4,5]); // instead of Math.max(1,2,3,4,5);

function max(a, b) {
    return a > b ? a : b;
}

var concat = reduce(function (a, b) {
    return a.concat(b);
}, []);

concat([[1,2],[3,4],[5,6]]) // instead of [1,2].concat([3,4],[5,6])

As for Array.prototype.push,因为它会改变输入数组而不是创建一个新数组,所以我更喜欢使用array.concat([element])代替array.push(element):

var push = reduce(function (a, e) {
    return a.concat([e]);
});

push([1,2,3], [4,5]); // instead of [1,2,3].push(4, 5)

那么这样写代码有什么好处:

  1. 柯里化太棒了。它允许您从旧函数创建新函数。
  2. 您不是使用可变参数,而是将数组传递给函数。所以你不需要任何特殊的方式来表明该函数使用arguments.
  3. 假设您必须找到名为的数组的总和array。使用这个方法你只需做sum(array)。如果您使用可变参数,那么您需要这样做add.apply(null, array).
  4. 假设你想求总和a, b & c。您需要做的就是sum([a,b,c]), 相比于add(a, b, c)。你需要投入额外的[]括号。然而这样做会让你的代码更容易理解。根据蟒蛇之禅 http://legacy.python.org/dev/peps/pep-0020/ “明确的比隐含的更好”.

这些是我从不在程序中使用可变参数的一些原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指示函数使用“参数”对象的最清晰方法是什么? 的相关文章

  • 通过 HTTPS 加载页面但请求不安全的 XMLHttpRequest 端点

    我有一个页面 上面有一些 D3 javascript 该页面位于 HTTPS 网站内 但证书是自签名的 当我加载页面时 我的 D3 可视化效果不显示 并且出现错误 混合内容 页面位于 https integration jsite com
  • 为什么 lodash 将我的数组转换为对象?

    我是 lodash 的新手 创建了一个函数 该函数从值为 null 或空白的对象中删除键 但是当我传递包含某些部分作为数组的对象时 它会删除数组并将其转换为对象 下面是我尝试过的代码 mixin removeFalsies this rem
  • 在 ES5 中创建自定义元素 v1,而不是 ES6

    现在 如果您严格遵循自定义元素规范 v1 https html spec whatwg org multipage custom elements html custom elements 无法在不支持类的浏览器中使用自定义元素 有没有办法
  • 应该使用encodeURI吗?

    javascript 的encodeURI 函数有任何有效用途吗 据我所知 当您尝试发出 HTTP 请求时 您应该 完整的 URI 您想要放入 URI 中的某些片段 可以是 unicode 字符串或 UTF 8 字节序列 在第一种情况下 显
  • 在 d3 中应用转换时出现错误

    我正在尝试对我在 d3 中设计的条形图应用一些过渡效果 这是我的代码 svg selectAll bar data data enter append g attr class bar append rect attr rx barRadi
  • 按 Enter 键提交消息?

    我正在开发一个基于本教程使用 Meteor 构建的聊天应用程序 http code tutsplus com tutorials real time messaging for meteor with meteor streams net
  • 使用 jQuery live() 初始化插件?

    使用 jQuery 在特定类的所有当前和未来元素上自动初始化插件的最佳方法是什么 例如 假设我想要全部
  • Durandal SPA 与打字稿有关的问题

    我使用 TypeScript 1 8 将我的 durandal SPA 应用程序从 VS 2012 更新到 VS 2015 它将生成 JavaScript ECMA5 我解决了所有构建错误 但我无法修复一个名为 return 语句只能在函数
  • 如何使用javascript将视频文件转换为字符串?

    我在 signalR 工作 我想通过将视频文件拆分为不同部分来将视频文件从一个客户端发送到另一个客户端 我已经通过分割图像源数据发送图像并在另一个客户端上接收该图像 document getElementById fileUpload ad
  • 当系列没有相同的时间值时,如何在工具提示中显示所有系列

    我有一个显示多个时间序列的图表 不同时间序列不会同时采样 有没有办法在工具提示中显示所有系列 在示例中 您可以看到所有系列都包含在前 2 个点的工具提示中 因为它们是同时采样的 其余点仅包含 1 个系列 var myChart echart
  • 全日历与 UTC 和本地日期的混淆

    我确实让 fullcalendar 正常初始化 所以它代表当前日期 午夜 gt 午夜 1 天 1 小时时段 我从其他一些数据源获取带有时间戳的数据 格式为 YYYY MM DD HH mm 作为字符串传输 无时区信息 因此 我将该字符串转换
  • FileReader 在 Ionic 2 中未触发 onloadend

    我正在尝试使用 cordova file plugin 读取本地文件 目前我可以读取本地目录的内容并选择单个文件 但我在获取文件内容时遇到问题 这是我的函数 从列表中选择文件后单击按钮即可调用该函数 import window resolv
  • axios 如何将 blob 与 arraybuffer 作为响应类型处理?

    我正在下载一个 zip 文件axios https www npmjs com package axios 为了进一步处理 我需要获取已下载的 原始 数据 据我所知 Javascript 有两种类型 Blob 和 Arraybuffers
  • 如何在 Node.js 中打开 Windows-1255 编码文件?

    我有一个 Windows 1255 希伯来语 编码的文件 我希望能够在 Node js 中访问它 我尝试使用打开文件fs readFile 它给了我一个Buffer我无能为力 我尝试将编码设置为Windows 1255 但这没有被识别 我还
  • 鼠标输入时反应显示按钮

    我有一个反应组件 它包含如下方法 mouseEnter console log this is mouse enter render var album list const albums this props if albums user
  • 反转比例函数

    这对我来说很有趣 看下面的D3代码 var scale d3 scale linear domain 100 500 range 10 350 scale 100 Returns 10 scale 300 Returns 180 scale
  • 单击 html 中的按钮后如何从 javascript 函数写入文件

    我正在尝试编写真正基本的代码 在 html 文件上按下按钮后 通过 JavaScript 函数在本地写入 txt 文件 这不可能吗 我可以仅使用 javascript 文件写入文件 但在尝试同时使用两者时则不能
  • 使用 CSP 防止自动点击链接 XSS 攻击

    当将 CSP 用于稍微不同的目的 沙箱 时 我意识到一个非常简单的自动点击链接似乎甚至可以绕过相对严格的 CSP 我所描述的内容如下 内容安全政策 default src none script src unsafe inline 还有身体
  • 如何使用node.js获取屏幕分辨率

    我需要使用 node js 获取屏幕分辨率 但以下代码不起作用 var w screen width var h screen height 这也行不通 var w window screen width var h window scre
  • 如何将函数导入到Vue组件中?

    我正在尝试将单个函数导入到我的 Vue 组件中 我为我的函数创建了一个单独的 js 文件 randomId js exports randomId gt My function 在我的 Vue 组件中 我导入了 Random js let

随机推荐

  • 为 Azure Api 管理 Git 存储库生成密码

    Azure Api 管理可以选择为集成 git 存储库创建有时限的密码 作为 VSTS 发布管理的一部分 我们希望将更改自动推送到此 git 存储库 我们不想每个月通过 Azure 门户创建一个新的 git 密码 发布者门户提供证书 htt
  • 无法使用 jquery 的单击事件处理程序来检测右键单击

    在尝试使用 jquery 检测鼠标右键单击时 我注意到单击事件处理程序似乎不会通过鼠标右键单击触发 而 mousedown 或 mouseup 事件处理程序则会触发 例如 右键单击测试 div 后 会出现以下警报 正在测试 test mou
  • 如何禁用 .htaccess 中的 mod_security 和 mod_security2

    我创建了一个 WordPress 插件 该插件很受欢迎 但我收到很多抱怨它不起作用 登录到许多用户的 WP 网站后 在询问管理员密码后 我注意到我无法轻松解决的最后一个问题是 mod security 和 mod security2 阻止了
  • load 在本地路径上工作,require 则不行

    装载者 rb puts gt This is the second file 加载演示 rb puts This is the first master program file load loadee rb puts And back a
  • Excel:按行内容对列进行排序

    这很难描述 我有一些专栏 比如说三个 10 20 20 20 22 24 24 24 26 我喜欢得到的是 10 XX XX 20 20 20 XX 22 XX 24 24 24 XX XX 26 其中 XX 是空单元格 有办法得到这个吗
  • python 计算列表中的元素数量

    我需要能够计算出列表中有多少个字符串 O top board None None None None None None None None None None None None None None None None None None
  • 使用服务的 DDD 实体

    我有一个应用程序 我试图使用至少一个名义上的 DDD 类型的域模型来构建 并且正在努力解决某个部分 我的实体有一些业务逻辑 这些逻辑使用我当前在某些域服务中拥有的一些财务计算和费率计算 以及我放入值对象中的一些常量值 我正在努力解决如何让实
  • 如何在不使用任何框架或库的情况下在屏幕上绘制图形?

    我想手动绘制图形 这意味着不使用任何库或框架 如 QT directX whindow h 就像向屏幕上的每个像素发出命令以在不同时间显示某种特定颜色 每个机构都会根据这些库或它们的名称提供教程 我想要的是制作我自己的 GUI 据我所知 这
  • 强制从外部页面刷新网页

    我有这样的情况 100 台计算机正在显示一个网页 我可以从后端更新此网页 我希望我的 100 台计算机上显示的网页能够自动更新 有没有办法在不轮询的情况下刷新 更新页面 最好的方法是外部页面可以强制页面重新加载 但我认为这是不可能的 Tha
  • 如何在 mariadb 中使用 -> 运算符查询 JSON 列

    我正在尝试获取时间表 将 json 列数据与 Laravel 项目中的以下代码进行比较 schedules Schedule where schedule with gt company person contact company per
  • Cassandra 3.10 debug.log 频繁包含“FailureDetector.java:457 - 忽略间隔时间...”

    我们的 Cassandra 3 10 集群之一的 debug log 文件经常出现类似于 FailureDetector java 457 忽略 的间隔时间 的消息 即使集群处于空闲状态 也会显示这些消息 我在这个 6 节点集群 两个数据中
  • 使用 Ruby 读取文件的上一行

    如何读取文件的前一行 与 IO gets 相反 我最初想将 IO lineno 设置为我想要读取的行号 但这并没有按预期工作 您实际上如何阅读前一行 一个简单的方法是记住您读过的上一行 prev nil File foreach vimrc
  • 如何获取未知 JSON 层次结构的总深度?

    我一直在努力寻找 构建一个递归函数来解析这个 JSON 文件并获取其子文件的总深度 该文件看起来像这样 var input name positive children name product service children name
  • 从点云到 Mat 的转换

    假设我初始化了一个点云 我想将其 RGB 通道存储在 opencv 的 Mat 数据类型中 我怎样才能做到这一点 pcl PointCloud
  • Chartjs 示例无法重现

    我希望从 Chartjs 文档中重现此示例的结果 https www chartjs org docs latest samples scales time line html https www chartjs org docs late
  • R 3.0.x 中的 RExcel

    兰德之友 http rcom univie ac at download html RAndFriends 其中包括运行所需的所有项目RExcel 仅包括R 2 15 2 我目前使用的是最新版本R but rcom 2 3 1 and rs
  • Android StaggeredGridLayoutManager 偏移错误

    当你清除你的adapter并打电话notifyDataSetChanged 交错网格布局管理器经理还有mCachedStart End in Span 实例 因此 当您向适配器添加新项目时 布局管理器会使用以下命令绘制项目offset 这是
  • 修改可变对象的方法?

    鉴于函数式编程在尽可能坚持不可变变量时是最好的 并且 Ramda 总是进行浅拷贝 那么对象如何must在大多数纯功能框架中处理可变的问题 例如 考虑 PIXI Sprite 在 pixi js 中 显示系统具有链接在一起的固有层次结构 并且
  • 在堆积条形图中添加组之间的间距

    假设我有一个带有分组条形的条形图 酒吧有一个大团体和多个非常小的团体 组标签位于组上 为了增加可读性 我想在组之间引入一定的间距 我使用以下代码和图像编辑器创建了一个示例图像 library ggplot2 g lt ggplot mpg
  • 指示函数使用“参数”对象的最清晰方法是什么?

    指示函数使用 参数 对象的最佳方式是什么 这显然是基于意见的 但是有任何约定吗 什么时候使用参数数组更好 一些例子 Function takes n arguments and makes them pretty function many