ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptのRestパラメータとパラメータデフォルト値を徹底学習_基礎知識

JavaScriptのRestパラメータとパラメータデフォルト値を徹底学習_基礎知識

WBOY
WBOYオリジナル
2016-05-16 15:48:341095ブラウズ

この記事では、JavaScript 関数の表現力を高める 2 つの機能、Rest パラメーターとパラメーターのデフォルト値について説明します。
残りのパラメーター

通常、可変パラメータを使用して関数を作成する必要があります。可変パラメータとは、関数が任意の数のパラメータを受け入れることができることを意味します。たとえば、String.prototype.concat は、引数として任意の数の文字列を受け入れることができます。 ES6 では、Rest パラメーターを使用して、可変個引数関数を作成する新しい方法が提供されます。

文字列に特定の部分文字列が含まれているかどうかを確認するサンプル関数 containsAll を実装してみましょう。たとえば、containsAll("banana", "b", "nan") は true を返し、containsAll("banana", "c", "nan") は false を返します。

以下は従来の実装です:

function containsAll(haystack) {
 for (var i = 1; i < arguments.length; i++) {
  var needle = arguments[i];
  if (haystack.indexOf(needle) === -1) {
   return false;
  }
 }
 return true;
}
 
function containsAll(haystack) {
 for (var i = 1; i < arguments.length; i++) {
  var needle = arguments[i];
  if (haystack.indexOf(needle) === -1) {
   return false;
  }
 }
 return true;
}

この実装では、引数オブジェクトを使用します。これは、関数が呼び出されたときに実際のパラメータ リストを含む配列のようなオブジェクトです。このコードはまさに私たちが求めているものですが、可読性は最適ではありません。この関数には仮パラメータ haystack が 1 つしかないため、引数をトラバースするときは、トラバースの開始インデックスが一般的な 0 ではなく 1 であることに特別な注意を払う必要があります。なぜなら、arguments[0] は関数定義時の仮パラメータ haystack であるからです。 haystack パラメータの前後にパラメータを追加したい場合は、内部ループを更新する必要があります。 Rest パラメーターはこれらの問題を解決します。Rest パラメーターの使用方法は次のとおりです。

function containsAll(haystack, ...needles) {
 for (var needle of needles) {
  if (haystack.indexOf(needle) === -1) {
   return false;
  }
 }
 return true;
}
 
function containsAll(haystack, ...needles) {
 for (var needle of needles) {
  if (haystack.indexOf(needle) === -1) {
   return false;
  }
 }
 return true;
}
上記の実装は両方ともニーズを満たしていますが、後者には特別な ...needles 構文が含まれています。 containsAll("banana", "b", "nan") を呼び出すときの詳細を見てみましょう。パラメータ haystack には、通常どおり、値 "banana" と省略記号が関数の最初の引数で埋められます。ニードルの前。これが Rest パラメーターであることを示します。残りの実パラメーターはすべて配列に入れられ、その配列はニーズの反復に割り当てられます。この呼び出しでは、ニーズの値は ["b", "nan"] です。その後、通常の関数が実行されます。

関数の最後の関数のみが Rest パラメーターとして使用できます。関数が呼び出されるとき、Rest パラメーターの前のパラメーターは通常どおりに入力され、他のパラメーターは配列に入れられます。 Rest パラメータの値として使用されます。これ以上パラメータがない場合、Rest パラメータの値は空の配列 [] になります。Rest パラメータの値が未定義になることはありません。


パラメータのデフォルト値

通常、関数を呼び出すとき、呼び出し元はすべての可能なパラメーターを渡す必要はなく、渡されないパラメーターには適切なデフォルト値が必要です。 JavaScript では、渡されないパラメータに対して固定のデフォルト値である unknown が設定されています。 ES6 では、任意のパラメータのデフォルト値を指定する新しい方法が導入されました。

以下の例を見てください:


function animalSentence(animals2="tigers", animals3="bears") {
  return `Lions and ${animals2} and ${animals3}! Oh my!`;
}
 
function animalSentence(animals2="tigers", animals3="bears") {
  return `Lions and ${animals2} and ${animals3}! Oh my!`;
}
各パラメータの = の後に、パラメータが渡されない場合のデフォルト値を指定する式があります。したがって、animalSentence() は「ライオンとトラとクマ! なんと!」、animalSentence("elephants") は「ライオンと象とクマ! なんと!」、animalSentence("elephants", "クジラ") は「ライオン」を返します。そしてゾウとクジラ!

パラメータのデフォルト値について注意すべき詳細:

Python とは異なり、パラメーターのデフォルト値の式は、関数が呼び出されたときに左から右に評価されます。これは、式で以前に入力されたパラメーターを使用できることを意味します。たとえば、上記の関数をもう少し興味深いものにすることができます:

function animalSentenceFancy(animals2="tigers",
  animals3=(animals2 == "bears") &#63; "sealions" : "bears")
{
 return `Lions and ${animals2} and ${animals3}! Oh my!`;
}

 
function animalSentenceFancy(animals2="tigers",
  animals3=(animals2 == "bears") &#63; "sealions" : "bears")
{
 return `Lions and ${animals2} and ${animals3}! Oh my!`;
}

その後、animalSentenceFancy("bears") は「ライオンとクマとアシカ。なんと!」を返します。

未定義を渡すことは、パラメータを渡さないことと同じです。したがって、animalSentence(未定義, "unicorns") は、「ライオンとトラとユニコーン! なんと!」を返します。

パラメータにデフォルト値が指定されていない場合、パラメータのデフォルト値は未定義であるため、

function myFunc(a=42, b) {...}
 
function myFunc(a=42, b) {...}

と同等です

function myFunc(a=42, b=undefined) {...}
 
function myFunc(a=42, b=undefined) {...}

引数を破棄

Rest パラメーターとパラメーターのデフォルト値を使用すると、引数オブジェクトを完全に廃止して、コードをより読みやすくすることができます。さらに、引数オブジェクトによって JavaScript の最適化がさらに難しくなります。

上記の 2 つの新機能が引数を完全に置き換えることができることを願っています。最初のステップとして、Rest パラメーターまたはパラメーターのデフォルト値を使用する場合は、引数オブジェクトの使用を避けてください。引数オブジェクトがすぐに削除されない場合、またはまったく削除されない場合は、Rest パラメーターまたはパラメーターの使用も避けることをお勧めします。引数オブジェクト。
互換性

Firefox 15 以降では、これら 2 つの新機能がすでにサポートされています。ただし、それ以外のブラウザはサポートされていません。最近、V8 の実験環境に Rest パラメータのサポートが追加されました。また、JSC は Rest パラメータとパラメータのデフォルト値に関していくつかの問題を提起しました。

Babel と Traceur の両方のコンパイラーはすでにパラメーターのデフォルト値をサポートしているため、それらを大胆に使用できます。
結論

技術的には、これら 2 つの新機能は関数に新しい動作を導入するものではありませんが、一部の関数宣言をより表現力豊かで読みやすくすることができます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。