undifinedをStringオブジェクトの引数に入れたら文字列undifinedに変換され、意図しない処理が入ってしまってびっくりしたので、投稿。
JavaScript初心者なので、間違い指摘はコメントください。
結論としては、「undifinedかどうか判断してから文字列変換しよう」です。
undifinedかどうか判断は、typeof a === "undefined"で比較などで対応しよう。
(undefinedは、typeof演算子をかけると文字列"undefined"に変換されるため)
実際、どのようにundifinedが文字列に変換されるか見てみましょう。
let a;
console.log(a + ":" + typeof a); // undefined:undefined
let b = String(a);
console.log(b + ":" + typeof b); // 'undefined:string'
let c = a.toString(); // Uncaught TypeError: Cannot read property 'toString' of undefined
// console.log(c + ":" + typeof c);
let d = a + "";
console.log(d + ":" + typeof d); // 'undefined:string'
let e = a.valueOf(); // Uncaught TypeError: Cannot read property 'valueOf' of undefined
// console.log(e + ":" + typeof e);
toStringやvalueOfは例外が生じます。
Stringやobj+""は文字列"undefined"に変換されます。
私の場合、Stringオブジェクトで変換していたため例外が生じず、気づくのが遅れてしまいました。
ただし、Stringオブジェクトは、「toStringでプリミティブ値が返されなければvalueOfを呼び、その値を文字列に変換する」というプロセスとなっているため、文字列変換において安定して使えるようです。
toStringやvalueOf、obj+""では、必ず文字列変換されるという保証がないとのことです。
詳しくは、下記のリンク先を読もう。(現在、勉強中・・・)
obj+""≠obj.toString()≠String(obj)っていう話 - Qiita より
toStringはJavaのように文字列の連結に暗黙的に使用されるメソッドではない。
obj+""はまずobj.valueOf()を呼び、obj.toString()を呼ばないことがある(がしかし、実は一つだけ例外がある)。
String(obj)は間違いなく obj.toString() を呼ぶ。
valueOfとtoStringメソッドの水深43cmぐらいの深さの話 - 三等兵
オブジェクトを文字列に変換するならtoStringで、数値ならvalueOfという傾向がある。(valueOfの場合正確には基本型に変換すると表現するのが正しい)
toStringのみでオブジェクトを変換するときはvalueOfに一切触れずに行う。逆にvalueOfのみで変換するときは、文字列のときはtoStringを通じて変換する。ただし、toStringが使えないようならそのままvalueOfで返す。