見出し画像

【GAS】該当がない場合の戻り値をテストしてみた(matchメソッド、filterメソッド)

はじめに


条件適合により配列を返すメソッドを使う時、例外時の戻り値がnullなのか空の配列なのか、また配列の各要素がundefinedなのか空文字列なのかを知らないと、条件分岐でつまづいてしまいそうです。

そこで、matchメソッドとfilterメソッドについて、いくつかテストをしてメモします。

matchメソッドの該当なし時の戻り値は「null」

と知っていましたが、typeofでObjectになるのは知りませんでした。
調べてみるとJavaScript(David Franagan (O'REILLYのサイの本))の第7版の P43にも書かれていました。

念のため、無理やりnullのlengthや、要素1をlog出力させようとしたらどうなるかも、試してみました。なぜなら、matchメソッドはもしも該当があった場合には配列を返すため、このような処理をすることが考えられるためです。結果は以下の通り。

function testOfMatchAndNull() { //matchメソッドで0マッチの場合の戻り値は「null」(空の配列や、空文字列の配列ではない)

  //「dog, cat, mouse」という文字列から「panda」をあるだけ抽出して配列で返すmatchメソッドを実行
  const str = "dog, cat, mouse";
  const regEx2 = /panda/g
  const resultArr2 = str.match(regEx2);

  console.log(resultArr2); // null 
  console.log(typeof resultArr2); // Object
  // console.log(resultArr2.length); nullのlengthは読めません、とエラーになる
  // console.log(resultArr2[0]); nullのインデックス0はありません、とエラーになる

}

↑この検証から、matchメソッドの例外処理は、nullと配列という、booleanが逆のものを分岐すればよいので、ガード節の条件式はif (!resultArr2) でOKそうかな、と思いました。

filterメソッドの該当なし時の戻り値は「空の配列」

こちらでも、空の配列に対して、無理やり要素1(インデックス0)の値やlengthをlog出力させようとしたらどうなるか、試してみました。

function testOfFilterAndEmptyArr() { //filterメソッドでコールバック関数のreturnをtrueにする要素がない場合の戻り値は「空の配列」
  const arr = ['Meg', 'Caroline', 'Pam', 'Elizabeth', 'Amy'];

  const extractedArr1 = arr.filter(element => element.length === 3); //lengthが3の要素(=ここでは3文字の文字列)を抽出
  console.log(extractedArr1); // ['Meg','Pam','Amy']

  const extractedArr2 = arr.filter(element => element.length === 5); //lengthが5の要素(=ここでは5文字の文字列)を抽出
  //空の配列についてのテスト
  console.log(extractedArr2); // []  
 console.log(!!extractedArr2); // true (配列の「要素」はundefinedだが配列は存在するので配列全体としてのbooleanはtrue)
  console.log(extractedArr2.length); // 0 (「空の配列」は要素がundefinedなのでlengthは0)
  console.log(extractedArr2[0]); // undefined
  console.log(typeof extractedArr2[0]); //undefined
  console.log(!!extractedArr2[0]); // false (undefinedはfalsy)
  console.log(typeof extractedArr2); // object (空の配列もobject)
  }

↑これを見ると、filterメソッドの例外処理は、空の配列か、要素が1以上ある配列の間で分岐する必要があり、これらのbool値はいずれもtrueなので、ガード節の条件式はif (!extractedArr2) ではダメで、if (extractedArr2.length===0)などと書く必要がありそうです。

ただ、extractedArr2.length =5などと指定したりすると、要素はundefinedのままlengthは正の数になり得るので(疎な配列)、この辺りはもう少し勉強が必要な気がしています。

おまけ:「空文字列が要素である配列」のテスト

「null」や「空の配列」のほかに、「空文字列が要素である配列」というのも存在するので、そちらについても実験結果をメモしておきます。

function testOfArrWithEmptyString() {

  //要素が空文字列である配列についてのテスト
  const arrEmptyString = [''];
  console.log(arrEmptyString); // [''] 
  console.log(arrEmptyString.length); // 1 (空文字列が要素として格納されているので、その空文字列による要素の数だけlengthが出る)
  console.log(arrEmptyString[0]); // 何も表示されない(quotation markすら表示されないのはちょっと意外、、、)
  console.log(typeof arrEmptyString); // Object (配列はオブジェクトの一種)
  console.log(!!arrEmptyString); // true (配列の「要素」は空文字列だが配列は存在するので配列全体としてのbooleanはtrue)

}



この記事が気に入ったらサポートをしてみませんか?