我有一个对象是一个接受参数的函数,我想传播对象,所以每个属性都是该函数中的一个参数。
我的代码中出错了什么?
test
答案 0 :(得分:11)
虽然其他答案是正确的,但是它们会将函数签名更改为接受对象而不是2个单独的参数。以下是如何在不更改函数签名的情况下将对象的值用作函数参数。这需要Object.values
(ES 2017)并且扩展运算符在您的运行时可用。
const args = {
a: 1,
b: 2
}
const fn = (a, b) => a + b
fn(...Object.values(args));
请记住,这仅适用于您的特定情况,因为Object.values
返回所有对象键的值,并不保证按字母顺序排序。如果您只想采用名为a
和b
的属性值,则可以映射Object.keys(args)
并仅过滤这些值。
答案 1 :(得分:7)
您可以对传递的参数使用ES6 object destructuring
,然后只传递您的对象。
const args = {a: 1, b: 2}
const fn = ({a, b}) => a + b
console.log(fn(args))

您还可以为这些属性设置默认值。
const args = {b: 2}
const fn = ({a = 0, b = 0}) => a + b
console.log(fn(args))

答案 2 :(得分:0)
你需要这样做
const fn = ({a, b}) => a + b
答案 3 :(得分:0)
其他答案当然适用于特定情况,但仍然存在一些局限性。因此,我想提出一种不同的方法。想法是向对象添加一个方法,该方法以适当的顺序返回所需参数的数组。该方法在作为参数传递给目标函数并用散布运算符对结果进行结构分解时执行。
const args = {
a: 1,
b: 2,
argumentify: function () {
return [this.a, this.b];
}
};
const fn = (a, b) => a + b;
console.log(fn(...args.argumentify()));
此方法的优点:
1)不需要更改目标函数的签名,因此可以用于ANY函数。
2)保证参数的正确顺序(据我所知,在扩展对象时无法保证)。
3)如果需要,可以将自身参数化。
答案 4 :(得分:0)