避免在JavaScript中传递大量参数的最佳做法

Node / Javascript中推荐模式的最佳做法是避免将大量parameter passing给函数?

function create(firstName, lastName, address, phoneNumber, username, password, dateOfBirth, age) { ... } 

它应该采取一个对象?

 const input = { firstName: 'John', lastName: 'Doe', ... }; function create(input) { } 

一个对象似乎很容易出错,因为它不应该包含的属性的数量和键名的validation。

一个对象似乎容易出错,因为它不应该包含的属性的数量和密钥的validation。

我可以将一个函数和一个HTML元素传递给你的第一个函数。 它可能会失败。

就其核心而言,任何脚本语言都是一个基本问题。 知道你搞砸了一个函数的唯一方法通常是一个运行时错误。 一旦编码正确,那不是什么大问题。

请注意,像TypeScript这样的语言对那些想在“编译时”执行这种正确性的人来说是一个很好的帮助。

它应该采取一个对象?

节点几乎专门用于Web服务器。 在这种情况下,你的切入点是典型的req.body ,一个对象。 到底谁知道这个东西是什么? 所以你error handling在服务器的前端:

 function bindUser(postBody, callback) { var user = {}; if (!postBody.firstName) { return callback(new Error("Missing firstName")); } user.firstName = postBody.firstName; if (!postBody.lastName) { return callback(new Error("Missing lastName")); } user.lastName = postBody.lastName; if (!postBody.email) { return callback(new Error("Missing email")); } user.email = postBody.email.toLowerCase(); callback(null, user); } 

恭喜,你有一个已知的对象,你未来的debugging有一个一致的起点。 现在,您可以构build执行一项特定任务的帮助函数,例如合并全名:

 function combineName(firstName, lastName) { return firstName + " " + lastName; } user.fullName = combineName(user.firstName, user.lastName); 

把你的error handling集中在不完全包含环境的地方,即I / O和外部模块。 除此之外,保持你的职能小而具体,他们不会需要10个参数和一个巨大的警卫墙。 你将来的debugging自我会感谢你。

所以要专门解决这个问题:

Node / Javascript中推荐模式的最佳做法是避免将大量parameter passing给函数?

devise你的应用程序,使函数不需要10个参数。

如果你在你的例子中这样做,你可以使用Object.keys(input)访问键,然后你可以检查长度或做额外的validation。 你可以看到一个属性是至less3个字符使用类似的东西:

 var keys = Object.keys(input); keys.every(function(key) { return key.length > 3; });