web-dev-qa-db-ja.com

ES6のパラメーター名?

私は次のような関数を定義しました:

function call_api(url, callback, query = {}, body = {})

本文を指定してクエリをスキップできる構文を期待しました。

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})

しかし、私はこの回避策を使用する必要があります:

call_api('/api/clients/new', function(x){console.log(x)}, {}, {1:2})

body=、それはqueryパラメータとして表示されます。私はWebpackでBabelを使用しています。 ChromeコンソールとWebpackソースで構文を試しました。

そのような構文はES6でサポートされていますか?それはどのように機能しますか?

25
Jesvin Jose

これを回避するには、オブジェクトを渡し、オブジェクトの分解を使用することをお勧めします。

function callApi({url, callback, query = {}, body = {}})

そしてそれを次のように呼び出します:

callAPI({url: "/api/..", callback: (x => console.log(x)), body: {a:2}})

これにより、必要な構文に類似した構文が得られます。

名前付き引数は、C#やPythonそれらをサポートする)のような他の言語とは異なり、JavaScriptでは考慮され、拒否されました。 これに関する最近の議論 から言語メーリングリスト。

27

this site に示されているように、デフォルトはデフォルト値を必要とするパラメーター(オプションパラメーターなど)のみであり、「スキップ」パラメーターではありません。

あなたがやろうとしているのは

// function definition
function hi(a,b,c,d)

// function call
hi(a,b,d)

ES6は、デフォルト値に関係なく、「d」が定義されたcであるとまだ考えています。
いいえ、ES6にはそのような構文はありません。

2
CherryNerd

呼び出しで割り当てるパラメーターを指定することはできません。

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})

関数の外でbodyという名前の変数を設定し、その値をクエリパラメータのスポットに渡すことと同じです。

あなたが望むものを達成するために解体を使用することもできます。

function call_api(url, callback, {query = {}, body = {}} = {})

その後、あなたの電話でこれを行います

call_api('/api/clients/new', function(x){console.log(x)}, {body:{1:2}})

2
Jonathan

デフォルトのパラメーター値が使用されるのは、パラメーターが未定義の場合のみであることから、パラメーターを「スキップ」してデフォルトに戻す唯一の方法は、その場所にundefinedを送信することです。

_call_api('/api/clients/new', function(x){console.log(x)}, undefined, {1:2})
_

例: Babel REPL

この場合、関数内のqueryの値は_{}_(またはデフォルトに設定したもの)になります。

これは、空の値を渡してデフォルトのパラメーター値を使用する場合の Visual Basicの動作 に似ています。 (例:sub name(argument 1, , , argument 4)

それ以外の場合、名前付きパラメーターのサポートが必要な場合、最善の妥協策は@Benjamin Gruenbaumによって提供される答えです。


更新:あなたは見つけるかもしれません この記事はargumentsキーワードを使用したオプションを提供します 、またはさらに良いことに、 ES6 _...rest_パラメータコレクションを反復 Javascriptで オーバーロードされた関数 をシミュレートできます。

1
Andrew Odri