javascript - 多个参数与选项对象

在创建具有多个参数的 JavaScript 函数时,我总是面临这样的选择:传递参数列表还是传递选项对象。

例如,我正在编写一个函数来将 nodeList 映射到数组:

function map(nodeList, callback, thisObject, fromIndex, toIndex){
    ...
}

我可以改用这个:

function map(options){
    ...
}

其中 options 是一个对象:

options={
    nodeList:...,
    callback:...,
    thisObject:...,
    fromIndex:...,
    toIndex:...
}

推荐的方式是哪一种?是否有关于何时使用一种与另一种的指南?

[更新] 似乎有一个支持选项对象的共识,所以我想添加一条评论:在我的案例中,我很想使用参数列表的一个原因是行为一致使用 JavaScript 内置的 array.map 方法。

最佳答案

与许多其他人一样,我通常更喜欢将 options 对象 传递给函数,而不是传递一长串参数,但这实际上取决于确切的上下文。

我使用代码可读性作为试金石。

例如,如果我有这个函数调用:

checkStringLength(inputStr, 10);

我认为代码的可读性很好,传递单个参数也很好。

另一方面,有些函数的调用如下:

initiateTransferProtocol("http", false, 150, 90, null, true, 18);

除非您进行一些研究,否则完全无法阅读。另一方面,这段代码读起来很好:

initiateTransferProtocol({
  "protocol": "http",
  "sync":      false,
  "delayBetweenRetries": 150,
  "randomVarianceBetweenRetries": 90,
  "retryCallback": null,
  "log": true,
  "maxRetries": 18
 });

它更像是一门艺术而不是一门科学,但如果我不得不说出经验法则:

在以下情况下使用选项参数:

  • 您有四个以上的参数
  • 任何参数都是可选的
  • 您曾经不得不查找函数以找出它需要哪些参数
  • 如果有人在尖叫“ARRRRRG!”时试图勒死你

https://stackoverflow.com/questions/12826977/

相关文章:

javascript - 由于 MIME 类型错误,Chrome 拒绝执行 AJAX 脚本

asp.net-mvc - 如何使用 Razor 将未编码的 Json 写入我的 View ?

json - 将 Map 转换为 POJO

json - 将 Go 结构转换为 JSON

ruby-on-rails - 如何使用 RSpec 检查 JSON 响应?

javascript - 将字符串转换为 JSON 对象

c# - 使用 JSON.NET 将 JSON 数据反序列化为 C#

javascript - 序列化包含循环对象值的对象

javascript - "SyntaxError: Unexpected token < in J

json - JSON可以容纳多少有限制吗?