Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6/TS:函数调用中的对象分解_Javascript_Typescript_Ecmascript 6 - Fatal编程技术网

Javascript ES6/TS:函数调用中的对象分解

Javascript ES6/TS:函数调用中的对象分解,javascript,typescript,ecmascript-6,Javascript,Typescript,Ecmascript 6,要在函数调用中实现对象的分解,什么是一个机智的ES6+/TS速记? 让我们假设一个Javascript函数被广泛使用,并且不能更改其签名 const foo = (b, a) => console.log(b, a); foo(66,55); // 66, 55 以及用于为调用参数提供值的对象 const o = {a: 55, b: 66 }; foo(o.b, o.a); // 66, 55 <-- ca

要在函数调用中实现对象的分解,什么是一个机智的ES6+/TS速记?

让我们假设一个Javascript函数被广泛使用,并且不能更改其签名

const foo = (b, a) => console.log(b, a);
foo(66,55);                  // 66, 55
以及用于为调用参数提供值的对象

const o = {a: 55, b: 66 };
foo(o.b, o.a);               // 66, 55       <-- can we find a short-hand ?    

如果无法更改函数的签名, 然后你必须用正确的顺序调用它

这对于物体的解构是不可能的,因为地图没有任何顺序

您可以使用应用执行类似操作:

foo.apply(null,Object.values(o));
但不能保证值的顺序

函数foo(a,b){返回a*b-a}
foo(3,1)/=>0
foo(1,3)/=>2
VarO1={a:3,b:1}
foo.apply(null,Object.values(o1))/=>2
VarO2={b:3,a:1}
foo.apply(null,Object.values(o2))/=>0

因此,没有任何巧妙的方法可以做到这一点。

如果您无法更改函数的签名, 然后你必须用正确的顺序调用它

这对于物体的解构是不可能的,因为地图没有任何顺序

您可以使用应用执行类似操作:

foo.apply(null,Object.values(o));
但不能保证值的顺序

函数foo(a,b){返回a*b-a}
foo(3,1)/=>0
foo(1,3)/=>2
VarO1={a:3,b:1}
foo.apply(null,Object.values(o1))/=>2
VarO2={b:3,a:1}
foo.apply(null,Object.values(o2))/=>0

因此,没有任何巧妙的方法可以做到这一点。

您无法将对象属性与位置参数匹配,因为对象顺序未定义。您无法做到这一点。Javascript不支持命名参数。@deceze,是的,我已经标记了它。在这些情况下,你有没有不同于“传统”(foo(o.b,o.a)的方法?没有,你所做的很大程度上取决于它是如何完成的。
foo(…[“b”,“a”])。map(p=>o[p])
可以做到。但是除非你的参数列表很大,或者属性是动态选择的,
foo(o.b,o.a)
是一种简单且首选的方法。您不能将对象属性与位置参数匹配,因为对象顺序未定义。您不能这样做。Javascript不支持命名参数。@deceze,是的,我已经标记了它。您的方法与“传统”(foo(o.b,o.a)不同吗在这些情况下?不,你所做的在很大程度上取决于它是如何完成的。
foo(…[“b”,“a”].map(p=>o[p])
可以做到。但是除非你的参数列表很大,或者属性是动态选择的,
foo(o.b,o.a)
是简单且首选的方法。
    foo(...Object.values(o)) // 55, 66 (no, JS object keys are unordered by definition)
    foo(...o);               // TypeError (short, but not valid, illustration only)
    foo(({b, a} = o));       // {a: 55, b: 66} undefined (no error, but we want 66, 55)